难以理解整个OSGi Web生态系统

28

我对Java和OSGi的世界还比较陌生,不太理解OSGi web应用程序的生态系统。

更具体地说,我目前试图理解整个生态系统中各个部分之间的关系:

  • OSGi框架(例如Apache Felix、Equinox、Knoplerfish)
  • OSGi运行时(例如Spring DM Server、Pax Runner、Apache Karaf)
  • Web扩展器(例如Pax Web Extender、Spring Web Extender)
  • Web容器(例如Apache Tomcat、Jetty)

为了让你更好地理解它们之间的关系,请看一下这张图片:

alt text

据我所知,OSGi框架是OSGi规范的一个实现。运行时是在OSGi规范之上添加了额外功能(例如日志记录)的分发版。由于OSGi和Web容器(如Tomcat)之间的类路径机制存在差异,因此需要某种翻译工具。这部分由"Web Extender"来处理。

请帮我澄清这整个事情。我的理解是否正确?

2个回答

25

OSGi是一个API和打包标准,用于交互软件模块。这类似于其他API标准,如JPA或Java EE。

OSGi运行时是遵循OSGi标准的服务器,是该标准的一种实现。您提到了一些常见的实现:Knopflerfish,Equinox。它们使您能够运行OSGi bundle。

Web容器通常指Java EE的Web特定部分(Servlets)的实现。Servlet标准也定义了一个API和打包标准,就像OSGi一样,只是不同而已。

您需要一个服务器来运行您的Java EE Web应用程序。将您的应用程序打包为Java Web Archive(WAR),并请求您的应用程序服务器启动它。有几个服务器,正如您所提到的,例如Tomcat,Jetty,还有覆盖更大部分Java EE标准的更大型的服务器,例如Glassfish和JBoss。

Web扩展程序试图将Servlet标准与OSGi统一起来。通过向已经打包好的WAR添加一些OSGi特定数据,该WAR将自动被解析并由您的OSGi运行时启动。 Web extender会将您的WAR Servlet发布到OSGi http服务上。使用Web扩展程序,您可以在仅使用OSGi运行时而无需像Tomcat这样符合Java EE标准的服务器的情况下运行标准OSGi应用程序以及WAR。


4
谢谢您的快速回复 disown。如果我理解正确,Web Extender可以接受WAR文件,通常会部署到Web容器(例如Tomcat)中,并使它们在OSGi运行时环境中运行。然后,OSGi HttpService将通过HTTP协议“在Web上”提供它们。是这样吗?总之,我的理解是:我不需要像Tomcat这样的Web容器了吗? - Jens
2
没错,你对它如何组合在一起的理解是准确的。你的服务将通过OSGi http服务提供。然而,在实践中,Web Extender使用Web容器来部署WAR文件。你获得的好处是,WAR文件可以使用OSGi框架的正常启动脚本启动,并且WAR文件可以参与OSGi框架的正常依赖管理(即你可以依赖于WAR文件,而WAR文件也可以依赖于其他OSGi捆绑包)。 - Alexander Torstling
1
所有的Servlet都将被注册到OSGi HTTP服务。 - Alexander Torstling
谢谢你的回答。那帮了我很多!我给了你一个赞并将你的回复标记为我的问题的答案。再次感谢。 - Jens
哇,这是关于Tomcat和OSGI如何结合的最好描述!您介意看一下我的问题吗?https://dev59.com/alHTa4cB1Zd3GeqPOAUY - Andriy Drozdyuk

3

Jens,

由于我有一些关于OSGi的经验,所以我真的不建议你从纯OSGi开始。

相反,你应该从Eclipse RCP(富客户端平台)开始。

如果你在这里下载Eclipse IDE for RCP and RAP Developers版本,你不仅可以获得一个OSGi运行时,还可以获得一个功能齐全的集成开发环境。

我们都很幸运,你可以买到最近几个月才出版的书籍Eclipse Rich Client Platform(第二版),其中包含了有关Eclipse RCP的更新信息/指南。

OSGi是Eclipse RCP的基本构建块,但是光看OSGi本身会让人感到困惑和无聊(至少对于初学者而言)。入门Eclipse RCP要容易得多且更加愉快,你可以在几个小时内构建一个实用的“做点什么”应用程序。

对于纯OSGi来说,如果你在前几天内能消除ClassNotFound异常,那已经算是很幸运的了。

在使用Eclipse RCP一段时间后,将你的应用程序“转换”为Eclipse RAP,以在Java Servlet容器上作为Web应用程序运行。看看你是否喜欢它,即使你不喜欢...到这个时候,你已经掌握了OSGi的概念和实践,因此如果你从头开始学习“纯OSGi”,那么你的进展会更加顺畅。

祝你好运,Jens!

P.S. 我也在我的Java EE博客上写有关这方面的内容,尽管不总是具体涉及OSGi。


嗨Hendy,谢谢你的回复。我想我不是普通的编码者,因为我认为纯OSGi并不差。我大多数的训练项目都是使用终端/控制台和简单的文本编辑器完成的;)我喜欢保持事情简单。但是整个Eclipse环境当然也不错,对于更大的项目来说这是最好的选择。我不知道为什么所有的OSGi编码人员都对纯OSGi感到如此羞耻?在我看来,它使Java再次变得有趣。 - Jens
我只是想在这里添砖加瓦。我不同意Hendy的建议,即不要查看或使用纯OSGi。有许多情况下,纯OSGi或其他一些OSGi组件比RCP更好。当然,RCP也有其用途,但它并非万能药。 - Marcel Offermans
1
@Marcel 谢谢你,我完全同意你的看法:“RCP有其用处,但它并不是万能的解决方案。”我的意思是说,Eclipse RCP是一个更容易入门(即学习阶段)OSGi的方式。在几天内,程序员将能够相对容易地完成许多事情,比起使用纯OSGi要容易得多,然后对OSGi有所了解。一个从纯OSGi开始的空白程序员可能会在最初的几天里遇到太多错误,并且很容易混淆。经过初始曲线之后,开发人员可以选择使用RCP还是纯OSGi更适合他们的项目。 - Hendy Irawan
Eclipse RCP和Equinox有什么区别? - Andriy Drozdyuk
1
Eclipse RCP是一个富客户端平台(因此得名),运行在称为Equinox的OSGi运行时之上。Equinox只是OSGi运行时。也许一个好的技术类比是Eclipse RCP是GUI,而Equinox/OSGi是内核。 - Hendy Irawan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接