要在OSGi中将OSGi嵌入到servlet容器或servlet容器中?

Lib*_*nek 7 tomcat osgi servlets equinox

我需要在servlet中重用最初为Eclipse RCP应用程序开发的代码(即盒装为Eclipse插件/ OSGi包).

在阅读了很多博客文章,文章,维基等之后,我最终知道了这一点:

  1. OSGi框架(在我的例子中是Equinox)可以嵌入到servlet容器中(在我的例子中是Tomcat 7)
  2. 或者Tomcat可以嵌入OSGi框架中.

Equinox建议第二种选择更容易.但对于生产他们建议1.我不确定为什么.在哪种情况下真的更好,为什么?

我是一个经验丰富的Tomcat用户,会将Tomcat嵌入Equinox变更管理吗?或者换句话说,嵌入在Equinox中的Tomcat会有什么不同?

Phi*_*all 5

首先,除了清单之外,代码是否还有任何OSGi/Equinox依赖项?如果不是它应该在普通的Tomcat中工作得很好.

我的理解是在Tomino中嵌入Tomcat会改变对它的管理.您的文件夹布局(包括server.xml和catalina.sh)将消失.相反,您可能会通过配置管理员管理Equinox应用程序.

其次,OSGi有两个servlet编程和部署模型.第一个是HttpService,您可以在其中以编程方式注册您的servlet和资源(您也可以通过扩展点执行此操作).在这种情况下,您的应用程序只是一个包的集合.但是,您无法使用过滤器.第二个是Web应用程序包(WAB),它是OSGified WAR.

  • 我完全忘了,如果你想在Equinox中运行Tomcat,你可能想看一下[Eclipse Virgo](http://www.eclipse.org/virgo/),而不是自己构建它. (2认同)

小智 5

我们一直在进行相当复杂的Web应用程序的迁移,该应用程序使用来自非OSGi的Jetty到Equinox上的OSGi.我已经了解了一些肯定会以某种方式推动您的决定的事情: - 如果您选择使用OSGi作为运行应用程序的框架,例如选项#2,那么您的应用程序消耗的所有内容都必须是OSGi捆绑包.商业图书馆的任何外部或第三方.如果你使用大量的开源,很容易找到捆绑包.或者,如果您找不到捆绑包,您可以使用BNDTools自行捆绑它们.仍然这种方法可能耗费时间来找出所有适当的依赖关系,并且可能的类加载器问题需要围绕OSGi进行攻击 - 将OSGi嵌入到Tomcat中的方法,这似乎表面上更安全,更容易.虽然我不确定在这种情况下你会从WAB获益.

BTW WAB的一个有趣的好处是,您可以轻松地在WebApp之间共享代码,因为它们被部署为捆绑包,您可以简单地在它们之间导出/导入包.今天非OSGi部署无法实现的功能.