领先一步
VMware提供培训和认证,以加速您的进步。
了解更多更新:添加了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容器支持的最有趣的功能包括:
要将WAR文件安装到OSGi,只需在调用BundleContext.installBundle或使用平台控制台时,在文件位置前面加上webbundle:。例如,在Equinox中,我可以这样做:
install webbundle:file:formtags.war
当然,这需要您在OSGi平台中安装了Web容器实现。
Web容器对WAR执行各种转换,以确保它具有符号名称、版本以及使其正常工作所需的导入。Web容器还将更新捆绑包类路径,以添加WEB-INF/classes和WEB-INF/lib中的每个JAR文件。
如果您不想依赖Web容器来转换WAR文件,则可以完全绕过转换阶段。只需自行添加相应的清单头并直接安装捆绑包,省略webbundle协议。
WAB的捆绑包类路径上不能有任何不在WEB-INF下的条目。这是为了防止任何应用程序类在您的Web应用程序中显示为资源。WAB可能会有其他限制,但这些限制尚未最终确定。
Web容器使用扩展程序模型来控制Web应用程序的生命周期。当相应的捆绑包启动时,Web应用程序启动;当该捆绑包停止时,Web应用程序停止。
在Equinox中,这意味着我可以直接从控制台启动和停止我的Web应用程序。例如,如果上面的formtags.war捆绑包被赋予捆绑包ID 50:
start 50 ... Tomcat输出 ... stop 50
可以通过将某些支持的配置属性附加到安装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容器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.servlet、javax.servlet.http、javax.servlet.jsp和javax.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支持,我将在接下来的几周内对此进行更多介绍。