与传统J2EE应用开发相比,OSGi 开发中最便利的地方就是可以直接在Eclipse 中进行调试。想起几年前在开发环境中与应用服务器集成开发调试遇到的麻烦,顿时感觉OSGi真是个好东西。不过应用最终还是要打包成 war 文件然后部署到应用服务器上去运行的。虽然当前的应用服务器都开始声称支持OSGi,但是似乎都不支持OSGi 应用的直接部署。我们仍然需要通过Equinox在容器内构建一个内部的OSGi 环境,然后使用servlet bridge 在web容器和OSGi 环境之间进行http 的转发。
将OSGi 应用打成war包的方法在eclipse equinox网页上已经有介绍:http://www.eclipse.org/equinox/server/http_in_container.php, 如下图所示:
在部署自己的应用中,plugins 目录下包含如下bundle:
感觉要成功部署OSGi应用,关键是确定plugins 目录下要包含哪些bundles。
本人在部署OSGi应用的时候遇到了几个问题:
1. 要加入org.apache.commons.logging_1.0.4.jar,否则spring-osgi-extender-1.0.jar 中的budle org.springframework.bundle.osgi.extender 无法正常start
2. 不要加入org.eclipse.equinox.http.jetty,否则web应用无法成功运行。Jetty是我们在Eclipse 中调试时使用的仿web容器,因此不能将其打包到war文件中去。
3. 所有bundle在部署之后默认处于Resolved状态,如果不将他们启动,则应用无法正常运行。我是通过在自己的一个应用bundle中将所有bundle启动来做的,方法请参考我的前一篇blog。