最近用OSGI+嵌入jetty做了一个IDE的后台管理,OSGI真是个好东西,即插即用。
现总结一下初学时候遇到的问题。
1、启动WEB服务
需要加载6个插件(org.eclipse.osgi是默认一定要加载的插件,不计入其中):
javax.servlet
org.apache.commons.logging
org.eclipse.equinox.http
org.eclipse.equinox.http.servlet
org.eclipse.osgi.services
org.mortbay.jetty
2、导出\配置\启动OSGI遇到的问题:
如何导出OSGI?
首先是打包,可以自己手动来,找到OSGI需要的全部插件,然后打包,也可以选择maven2等插件来帮助打包并解决依赖性问题,目前为了保持干净的工作空间,我没有安装任何其他的插件,但又有数百个插件是要打包的,这种情况下,推荐如下方式:
a、新建一个target difinition项目,该项目用来保存各种版本的压缩文件
b、在该项目下新建一个.target文件,该target使用方式是一目了然的,Eclipse提供了target editor。
在这里选择引用文件夹,target编辑器将会从这些位置搜索插件,注意,它并不真正的产生效果,仅仅只是为了后面查找插件依赖服务的,相当于添加索引。
在这个位置添加你要启动的插件,依赖性通过右边的“Add Required”自动完成。注意:该editor的功能并不完善,它只是原样的导出你的选择,所以如果是你自己写的插件,请之后再手动export,不然只有src没有bin,当然你可以通过配置build选项,给bin文件夹打钩来解决(我的下步工作会是写个新的构建器,使之能给自定义插件打jar包),然后,add required也会导入很多多余的插件,如ui包等。
然后选择导出,即可。
如何配置OSGI?
你需要一个start.bat,内容参考插件configuration的argument
如
java -jar -Dorg.osgi.service.http.port=10000 equinox.jar -console 10000为指定的端口。 equinox.jar是启动的jar包,equinox是eclipse基于OSGI框架的产品。该jar包可以在eclipse的plugins目录找到。复制,放在根目录下。创建一个configuration文件夹,里面有config.ini配置文件。内容如下: #This configuration file was written by: #org.eclipse.equinox.internal.frameworkadmin.equinox.EquinoxFwConfigFileParser
#Thu Dec 22 15:48:36 CST 2011
#org.eclipse.update.reconcile=false
#osgi.instance.area.default=@user.home/workspace
#osgi.framework=plugins/org.eclipse.osgi_3.7.0.v20110613.jar
#equinox.use.ds=true
osgi.noShutdown=true
eclipse.ignoreApp=true
#org.osgi.framework.bootdelegation=*
osgi.bundles=reference\:file\:plugins/javax.servlet_2.5.0.v201103041518.jar@\:start,\
reference\:file\:plugins/org.apache.commons.logging_1.0.4.v201101211617.jar@\:start,\
reference\:file\:plugins/org.eclipse.equinox.http.jetty_2.0.100.v20110502.jar@\:start,\
reference\:file\:plugins/org.eclipse.equinox.http.servlet_1.1.200.v20110502.jar@\:start,\
reference\:file\:plugins/org.mortbay.jetty.util_6.1.23.v201012071420.jar@\:start,\
reference\:file\:plugins/org.mortbay.jetty.server_6.1.23.v201012071420.jar@\:start,\
reference\:file\:plugins/org.eclipse.osgi.services_3.3.0.v20110513.jar@\:start
osgi.bundles.defaultStartLevel=4嗯,以上属性……参考字面意思。注意插件的加载级别即可。 如何启动OSGI?双击start.bat……
遇到的ClassNotFoundException问题
有可能是因为config.ini中的org.osgi.framework.bootdelegation没有配置好
org.osgi.framework.bootdelegation=* 即可
当然也可以指定package,用逗号隔开,可以使用通配符