OSGi Web容器简介

工程 | Rob Harrop | 2009年5月27日 | ...

更新:添加了Git的版本控制说明。

在过去的几个月里,我一直在与来自OSGi企业专家组的Subbarao Meduri、Graham Charters、Hal Hildebrand等人一起研究RFC66 Web容器规范。Web容器规范定义了如何以标准方式在OSGi服务平台上部署WAR文件。

这对我们来说非常有趣,因为dm Server已经支持WAR文件将近18个月了,我们很高兴能够朝着标准模型努力。作为最终用户,您将能够在OSGi上部署WAR文件,而无需依赖于专有API或功能。

SpringSource负责编写Web容器参考实现,我过去几周一直在做这项工作。在本博客中,我将描述Web容器规范的主要功能,并讨论开始使用RI代码所需的步骤。我不允许发布规范文档,但我将概述最重要的几点。

目前,RI没有二进制分发版,但从源代码构建起来非常容易。

Web容器中的主要功能

Web容器支持的最有趣的功能包括:

  • 安装WAR文件
  • 安装Web应用程序捆绑包(WAB)
  • 使用扩展程序控制Web应用程序生命周期
  • 使用URL参数控制配置属性

安装WAR文件

对我来说,Web容器最令人兴奋的功能是能够直接将WAR文件部署到OSGi *而无需更改您的代码*。(使用JNDI的WAR文件无法在不更改代码的情况下使用,因为JNDI目前还不是规范的一部分。正在努力解决这个问题,所以我预计这个限制不会永远存在。)

要将WAR文件安装到OSGi,只需在调用BundleContext.installBundle或使用平台控制台时,在文件位置前面加上webbundle:。例如,在Equinox中,我可以这样做:

install webbundle:file:formtags.war

当然,这需要您在OSGi平台中安装了Web容器实现。

Web容器对WAR执行各种转换,以确保它具有符号名称、版本以及使其正常工作所需的导入。Web容器还将更新捆绑包类路径,以添加WEB-INF/classesWEB-INF/lib中的每个JAR文件。

安装Web应用程序捆绑包(WAB)

如果您不想依赖Web容器来转换WAR文件,则可以完全绕过转换阶段。只需自行添加相应的清单头并直接安装捆绑包,省略webbundle协议。

WAB的捆绑包类路径上不能有任何不在WEB-INF下的条目。这是为了防止任何应用程序类在您的Web应用程序中显示为资源。WAB可能会有其他限制,但这些限制尚未最终确定。

使用扩展程序进行生命周期控制

Web容器使用扩展程序模型来控制Web应用程序的生命周期。当相应的捆绑包启动时,Web应用程序启动;当该捆绑包停止时,Web应用程序停止。

在Equinox中,这意味着我可以直接从控制台启动和停止我的Web应用程序。例如,如果上面的formtags.war捆绑包被赋予捆绑包ID 50:

start 50 ... Tomcat输出 ... stop 50

使用URL参数控制配置

可以通过将某些支持的配置属性附加到安装URL来控制WAR文件的配置。

例如,要控制Web应用程序的上下文路径,您可以添加Web-ContextPath选项:

install webbundle:file:formtags.war?Web-ContextPath=ftags

或控制生成的Bundle-SymbolicName头:

install webbundle:file:formtags.war?Bundle-SymbolicName=ftags.bundle

Web容器和dm Server

Web容器RI中的代码主要取自dm Server中的代码并从中获得灵感,但是,RI*不需要*完整的dm Server。我们将用Web容器RI替换dm Server中当前的Web代码,并将Web容器作为在OSGi上构建Web应用程序的推荐方法。

参考实现简介

Web容器RI使用Tomcat作为servlet容器实现。RI本身由四个捆绑包组成。core捆绑包包含所有与servlet容器无关的代码。tomcat捆绑包包含Tomcat特定的代码。tomcat.fragment捆绑包包含默认的Tomcat配置,并作为片段附加到Tomcat Catalina捆绑包。extender捆绑包包含所有扩展程序行为,如果希望手动管理Web应用程序生命周期,则可以将其删除。

构建参考实现

要运行RI,您需要从源代码构建它。可以直接从Git获取源代码:

git clone git://git.springsource.org/osgi-web-container/osgi-web-container.git

检出代码后,您可以使用以下命令构建和测试它:

cd build-web-container ant clean test collect

如果您的测试失败,请提出JIRA。成功构建后,您可以运行Web容器并安装一些WAR文件。

运行参考实现

我正在使用PAX Runner来运行Web容器RI。我的PAX Runner配置使用构建的二进制文件和Ivy管理的依赖项来运行Web容器。

build-web-container目录中,您会找到一个名为runner.bundles的文件。此文件可用于指示PAX Runner安装Web容器所需的所有捆绑包。

pax-run --platform=equinox --snapshot runner.bundles

此命令使用PAX Runner启动Equinox。--snapshot标志告诉PAX Runner下载Equinox的最新稳定版本——一个实现了最新已知OSGi 4.2规范的版本。

Equinox启动后,发出ss命令以验证是否已安装捆绑包,您应该看到大约45个捆绑包已安装并正在运行。

安装应用程序

我正在使用dm Server中的FormTags WAR示例进行测试。您可以从此处下载:这里

如果我尝试直接安装FormTags应用程序,事情不会像预期的那样进行:

install webbundle:file:formtags.war Bundle id is 48 start 48

运行start后,我收到一个错误,抱怨org.xml.sax包中某个类的ClassNotFoundException。这里的问题是WAR文件默认只提供4个导入:javax.servletjavax.servlet.httpjavax.servlet.jspjavax.servlet.tagext

使用Import-Package URL参数可以相对轻松地解决此问题:

uninstall 48 install webbundle:file:/Users/robharrop/tmp/formtags.war?Import-Package=org.xml.sax,org.xml.sax.helpers,javax.xml.parsers,org.w3c.dom Bundle id is 49 start 49

在这里,我指定了FormTags应用程序所需的额外包导入。这次,该应用程序成功启动,并且可以通过Web浏览器在https://127.0.0.1:8080/formtags访问。

在dm Server中,WAR文件会为系统捆绑包导出的每个包导入一个包,这意味着常见的系统类型会自动可用。我认为这是一个有用的功能,我很想知道您是否同意,或者您是否更喜欢手动控制对系统包的访问。

接下来是什么?

Web容器规范仍在不断发展,我正在努力使RI保持同步。我正在努力将dm Server迁移为使用Web容器RI来代替其自身的Web支持,我将在接下来的几周内对此进行更多介绍。

获取Spring新闻通讯

与Spring新闻通讯保持联系

订阅

领先一步

VMware提供培训和认证,以加速您的进步。

了解更多

获得支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看Spring社区中所有即将举行的活动。

查看全部