OSGi - 这项技术有多成熟?

时间:2009-12-02 16:25:06

标签: java spring maven-2 struts2 osgi

我需要在不同的地方共享一些网络资源(jsphtmljsimagescss等。基于Spring的{​​{1}}个应用程序。似乎Struts 2可以用来实现这个目标吗?

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

提前致谢!

修改 我浏览了this帖子,似乎人们可以跨Web应用程序共享Web捆绑包。唯一的区别是他们用Spring MVC做到了。我想知道是否可以用Struts2应用程序实现这一点?

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

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

4 个答案:

答案 0 :(得分:7)

虽然OSGI可能是一个解决方案,但它可能有点矫枉过正(而且,正如Bozho指出的那样,你需要一个支持OSGI的容器)。或许可以查看How to share resources across projects in Maven其他选项:

        

在这篇博客中,我将展示如何做到这一点   第二种选择,因为在我看来,它   目前是最稳定的   灵活。将来,我会试试   maven-remote-resources-plugin和   写一个教程。

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

您可能还想阅读上一次stackoverflow帖子中的帖子.war vs .ear file

答案 3 :(得分:1)

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

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

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

the modular web apps问题的第一个答案看起来很有意思,虽然不能直接应用于SpringSource服务器,因为它不提供OSGi HttpService。我相信最近的OSGi 4.2企业规范工作也正朝着SpringSource服务器的deploy-war-files-as-OSGi-bundles方法发展。

在回答您的 EDIT 2 问题时,如果我理解正确,answer中的“网络上下文”将使用HttpService动态构建,HttpService是一个提供的界面

的方法
  1. 在URL下注册servlet,

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

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