OSGi – 这项技术有多成熟?

我有一个要求,我需要在不同的基于SpringStruts 2应用程序之间共享一些Web资源( jsphtmljsimagescss等)。 并且似乎OSGi可以用来实现这一目标吗?

  • 有人可以给出一些关于如何用OSGi实现这一目标的指示吗?
  • 其次我想知道OSGi足够成熟,可以用于生产应用程序?

提前致谢!

编辑:我经历了这篇文章,似乎人们可以跨Web应用程序共享一个Web包。 唯一的区别是他们用Spring MVC做到了。 我想知道这是否可以通过Struts2应用程序实现?

编辑2:我基本上不清楚以下内容:

  • ‘shareable-bundle’(包含要共享的Web资源)是否为.war打包。 如果是,那么将从哪里形成最终的Web上下文,因为该捆绑包将再次与主“web”应用程序共享? 我期待最终的Web上下文是由’shareable-bundle’和’main’Web应用程序的合并而形成的。 它会自动发生吗? 有任何想法吗?

虽然OSGI可能是一个解决方案,但它可能有点矫枉过正(而且,正如Bozho指出的那样,你需要一个支持OSGI的容器)。 也许看看如何在Maven中跨项目共享资源以获取其他选项:

  • 剪切并粘贴它们。
  • 使用Assembly和Dependency插件
  • 使用maven-remote-resources-plugin

在这个博客中,我将展示如何做第二个选项,因为在我看来,它目前是最稳定和最灵活的。 将来,我将试用maven-remote-resources-plugin并编写教程。

编辑:回答OP的评论。 是的 ,它的想法是创建可共享Web资源的程序集,并使用maven-dependency-plugin在“资源 – 消费者”项目中提取和解压缩程序集。 所有这些都在上面提到的博客文章中进行了解释和详述。 如果有任何不清楚的地方,请告诉我。

OSGi用于Eclipse,GlassFish,ServiceMix(以及其他),它们是成熟的软件产品。 但是,它们本质上非常具体,我个人认为,OSGi不太适合普通类型的项目。 据我所知(有人纠正我,如果这个领域有新闻),如果你想将OSGi用于Web应用程序,你需要一个OSGi捆绑的servlet容器。 另外,在OSGi包中放置资源(html,js,images)可能很麻烦。

OSGi是一种相当成熟的技术 – 这就是所有Eclipse插件的结构。 但是,该技术尚未在Web应用程序空间中获得吸引力,因为支持它的servlet容器非常少。

如果你想阅读它,你应该查看Craig Wells的Modular Java ,因为它提供了与Spring Framework相关的OSGi相当好的背景知识。

关于共享资源,您可能希望查看EAR包。 我已成功使用它来部署多个具有一组公共资源的WAR文件(例如,Dojo的压缩版本)。

例如,EAR可能如下所示:

  ear-file/proj1 ear-file/proj2 ear-file/config ear-file/lib ear-file/resources ear-file/META-INF ear-file/APP-INF 

您可能还想阅读上一个stackoverflowpost中的.war vs .ear文件 。

我对Struts(或Spring MVC)并不过分熟悉,但你可能会看一下SpringSource dm Server 。 它基于Equinox,Eclipse使用的OSGi容器,以及捆绑的Apache Tomcat(以及Spring框架的东西)。

使用SpringSource服务器,传统上或多或少地部署每个war文件,但可以通过正常的OSGi机制访问资源(类,服务等)。 这些机制基于OSGi bundle的类加载器,这对于共享jsps,html,css等文件资源可能会有问题。 如果你有类似于DefaultServlet的东西,它可以从类加载器而不是文件系统中提取东西。 (或者,哎呀,我可能会比我需要的更复杂。)

另一方面,您可以将所有内容部署为独立的Web应用程序,并在客户端将它们拼接在一起。

模块化Web应用程序问题的第一个答案看起来非常有趣,虽然不能直接应用于SpringSource服务器,因为它不提供OSGi HttpService。 我相信最近的OSGi 4.2企业规范工作正朝着SpringSource服务器的deploy-war-files-as-OSGi-bundles方法发展。

在回答您的EDIT 2问题时,如果我理解正确,那么该答案中的“Web上下文”将使用HttpService动态构建,HttpService是一个提供方法的接口。

  1. 在URL下注册servlet,和

  2. 在URL下注册资源(文件等)。

由于这些操作是动态处理的,因此不需要明确合并Web上下文位。