前一段时间,利用Felix作为osgi container,测试了osgi bundle的开发,并通过和springdm的结合,实现对于service发布和引用的实现。
现在希望把以前实现的一些bundle和界面显示结合起来,当然可以把Felix Container和应用bundle发布在Web Container中,然后通过Client端(可以是RCP或者Browser)来显示内容,但是作为一个技术研究方向,如何实现这些bundle在Eclipse Equinox中应用,一直困扰着我,于是想把通过Eclipse RCP显示内容和Equinox的应用结合起来,实现这两方面技术的融合。
作为bundle能够在java程序中运行的第一步,就是需要在java程序中,把Equinox osgi container启动起来和加载自己实现的bundle。在Eclipse的例子中有一个:org.eclipse.equinox.servletbridge实现了在Web Container中启动Equinox Container,可惜的是,这个例子中应用的Equinox版本较低,和我目前应用的Eclipse3.5版本不一致(在作Felix的时候也遇到了相同的问题,例子是1.x版本的,但是在2.0版本时,Felix做了很大的结构调整),所以想拿现成的例子不现实了。
于是就自己开始动手,尝试实现Equinox嵌入到普通的Java Application中。在前面的例子中提到了在Java Application中启动Equinox利用EclipseStarter(org.eclipse.core.runtime.adaptor.EclipseStarter,看来Equinox还是主要服务Eclipse了,否则为什么不叫EquinoxStarter,其实在刚开始寻找入口时,我的确是去找这样的一个类了,很杯具),其中有一个main函数,可以直接的执行,在最初的实验中,执行这个main总是报错:
!ENTRY org.eclipse.osgi 4 0 2011-09-15 16:27:22.610
!MESSAGE Application error
!STACK 1
java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:74)
at EclipseStarter.run(EclipseStarter.java:372)
at EclipseStarter.run(EclipseStarter.java:181)
at EclipseStarter.main(EclipseStarter.java:152)
同时,也无法得到osgi的控制台,不知道是否Equinox启动成功,也不知道自己的bundle是否已经加载,很是郁闷!按照错误的内容只能去仔细的分析config.ini中的配置了,配置很多很多,eclipse的help中有具体的解释。
通过阅读帮助,发现了一个eclipse.ignoreApp的配置参数,如下的解释:
if set to "true" then the main launching thread will not start the default
application and will proceed in shutting down the platform and exiting. The
default value is "false". This is different than the eclipse.application.launchDefault
option because the main thread will not wait for an application descriptor
service to be launched
看了半天,好像和上面的问题没有关系,试着设了一下:eclipse.ignoreApp=true。这个错误不报了!在认真地分析一下,认为这个参数是控制Equinox Container是否启动Eclipse的开关,如果为true,则只启动Osgi Container,而不启动Eclipse的应用了,所以就不报错了,按照这样的逻辑,通过这样的设置,Equinox Container作为System bundle应当启动成功了。
可是看不到osgi的控制台,无法看到bundle的状态,就无法判断了。继续深入学习config.ini文件的配置项,发现了osgi.console,需要设置一个端口,于是设置了一个9090,启动时显示Listening on port 9090 ... ,应当通过telnet可以练上去。
真没想到在win7的command窗口输入telnet后竟然说找不到这个指令,连忙上网查了一下,原来win7为了安全的原因,竟然默认情况下没有安装telnet!只能装一下了,不过又解决了操作系统的一个问题。装好后,在command上执行:
telnet localhost 9090,终于见到了久违的 "osgi>";利用ss查了一下,系统bundle和自己写的测试bundle状态正常,说明,在java application中启动Equinox Container成功了。
分享到:
相关推荐
equinox-SDK-3.7.zip equinox-SDK-3.7.zip equinox-SDK-3.7.zip equinox-SDK-3.7.zip equinox-SDK-3.7.zip equinox-SDK-3.7.zip
OSGI 在 J2EE 环境下的应用越来越广泛,目前在 Servlet 应用中使用 OSGI 有两种方式:Servlet Container in OSGI 和 OSGI in Servlet Container. 前一种:和普通的 OSGI bundle 开发差不多,而后一种:Equinox 提供...
equinox
第三部分由原型构建转向实际的产品开发,主要介绍了OSGi和Equinox中用来构建成熟的OSGi应用必不可少的API——服务器端、声明式服务和发布工程,以及如何用它们来解决实践中的一些问题;第四部分呈现了动态性的最佳...
eclipse de osgi框架 equinox-SDK-3.6.1.part1
OSGi and Equinox, Creating Highly Modular Java Systems
深入理解OSGi:Equinox原理、应用与最佳实践源代码,同时附带equinox-SDK-3.8源代码。
Equinox p2详细图示讲解, RCP中如何实现版本检测,更新
equinox-SDK-4.18.zip
Equinox
org.eclipse.equinox.executable org.eclipse.equinox.launcher org.eclipse.osgi org.eclipse.osgi.tests 另加几篇分析的文章
equinox-all-1.7。Appfuse的缩小版。
equinox-SDK-3.8.zip源码包
我实现的《使用Equinox开发OSGI应用程序》全部功能的代码和分发包,工程师基于Eclipse3.3的
OSGI标准实现框架equinox的SDK,版本是3.8.2.里面包含equinox的所有插件jar包,适合做OSGI的开发。
osgi的规范实现equinox 基于eclipse版本Oxygen的实现库,官网下载实在太慢,小水管下好后,方便大家下载!
《深入理解OSGi:Equinox原理、应用与最佳实践》,作者周志明 / 谢小明,本书是原创Java技术图书领域继《深入理解Java虚拟机》后的又一实力之作,也是全球首本基于最新OSGi R5.0规范的著作。
Equinox是OSGI R4的一个实现,Equinox这个项目是由Eclipse 开源组织实现并发布的,也是大名鼎鼎的Java开发工具 Eclipse 的底层机制的实现,如果对Eclipse有点熟悉的话,你就知道Equinox 这个东西是多么的棒了,...