打造一个基于OSGi的Web Application——为OSGi容器提供Web Application环境

本章叙述如何在OSGi容器中提供必要的Web Application环境,其中包括Servlet 2.4、Jsp 2.0和Commons-Logging相关的package,使得其他在OSGi容器中的bundle可以import。

为了在OSGi容器中提供export的package,一般有三种方式:

  1. 一个常规的bundle,自身包含必要的class,同时在Export-Package中声明。
  2. 一个Host为System Bundle的Fragment Bundle,同样也可以在Export-Package中声明导出的package,只要这个package中的class在System Bundle的ClassLoader中能load到。
  3. 通过启动Framework的配置项:org.osgi.framework.system.packages和org.osgi.framework.system.packages.extra。OSGi 4.2规范中描述了这两个标准的配置项。在这两个配置项中描述的package都等同于在System Bundle中声明了export。


对于在Web Application中运行的OSGi容器,一些必要的环境是通过Web Container提供的,我们最好不要,也不应该用自己的类来替换,这包括了j2ee相关的jar,如servlet和jsp相关的jar等等。在一些WebServer的实现中,会自动屏蔽Web Application的classpath中的j2ee相关的jar。

除了j2ee相关的jar之外,还有一些使用非常普遍的jar,比如说Apache commons一类,其中最常用的大概就是commons-lang.jar、commons-io.jar和commons-logging.jar了,这些jar最好也有Web Container来提供,或者有必要的话,在Web Application中提供,而不是在OSGi容器中提供,这涉及到一些JVM层次的单例类,或者希望能由Web Application级别来统一实现和配置的环境,最常见的应用就是日志配置了。通过由Web Application提供的commons-logging来给OSGi容器中的环境使用,而commons-logging通过何种方式来实现,不需要让OSGi内部知道。

至于导出package到OSGi的方式中,是采用第二种还是第三种,主要区别在于:第三种方式是加载framework时指定的,在其后的生命周期中不可更改,而第二种方式则更符合OSGi动态加载的特性。

我采用第二种方式来给OSGi容器增加环境支持,具体操作很简单,以Servlet为例,首先编写一个文本文件,名字为:MANIFEST.MF,内容如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->  1   Manifest-Version:  1.0
 2   Bundle-ManifestVersion:  2
 3   Bundle-Name: Servlet Extension Fragment
 4   Bundle-SymbolicName: javax.servlet_extension ; singleton:=true
 5   Bundle-Version:  2.4.0
 6   Fragment-Host: system.bundle ;  extension:=framework
 7   Bundle-RequiredExecutionEnvironment: J2SE- 1.5
 8   Export-Package: javax.servlet ; version="2.4.0",
 9    javax.servlet.http ; version="2.4.0",
10    javax.servlet.resources ; version="2.4.0"
11   Bundle-Vendor: dbstar

注意其中关键的header属性,Fragment-Host: system.bundle; extension:=framework
这样写才能保证这个Fragment Bundle在各种OSGi Framework实现中都能兼容。
保存以后,将这个文件放置到一个名字为META-INF的目录中,然后用jar命令打包成一个jar即可(或者用winrar打包,记得选择压缩方式为zip,在打包后将zip后缀名改成jar,我通常都是这么干的)。

Jsp的MANIFEST.MF:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->  1   Manifest-Version:  1.0
 2   Bundle-ManifestVersion:  2
 3   Bundle-Name: Jsp Extension Fragment
 4   Bundle-SymbolicName: javax.servlet.jsp_extension ; singleton:=true
 5   Bundle-Version:  2.0.0
 6   Bundle-Vendor: dbstar
 7   Fragment-Host: system.bundle ;  extension:=framework
 8   Bundle-RequiredExecutionEnvironment: J2SE- 1.5
 9   Export-Package: javax.servlet.jsp ; version="2.0.0",
10    javax.servlet.jsp.el ; version="2.0.0",
11    javax.servlet.jsp.resources ; version="2.0.0",
12    javax.servlet.jsp.tagext ; version="2.0.0"


commons-logging的MANIFEST.MF

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->  1   Manifest-Version:  1.0
 2   Bundle-ManifestVersion:  2
 3   Bundle-Name: Commons Logging Extension Fragment
 4   Bundle-SymbolicName: org.apache.commons.logging_extension ; singleton:=true
 5   Bundle-Version:  1.1.1
 6   Bundle-Vendor: dbstar
 7   Fragment-Host: system.bundle ;  extension:=framework
 8   Bundle-RequiredExecutionEnvironment: J2SE- 1.5
 9   Export-Package: org.apache.commons.logging ; version="1.1.1",
10    org.apache.commons.logging.impl ; version="1.1.1"

因为我用的是commons-logging-1.1.1.jar,所以version写的是1.1.1,大家可以修改成自己所使用的jar的版本。


将上面生成的三个jar放到OSGi-Web项目的WEB-INF/osgi/plugins目录下面。还记得我在上一章创建的那个Tomcat Server么,clean一次,新的jar会部署到Tomcat中去,然后就可以运行Server了。
至于为什么是clean而不是publish,区别在于clean会清除所有OSGi容器创建出来的文件,这样下次启动OSGi时就会做一个install bundle的事情,而publish不会自动install新加进去的bundle。

如果你使用的是equinox,那么你可以在控制台中看到Syetem Bundle现在多了几个Fragments,查看一下Servlet Bundle,会显示下列信息,表示servlet 2.4的package在OSGi容器中已经可用了:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> osgi> bundle  2
javax.servlet_extension_2
.4.0   [ 2 ]
  Id
= 2 ,  Status = RESOLVED    Data Root = D:\dbstar\workspaces\OSGi\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\OSGi-Web\WEB-INF\osgi\configuration\org.eclipse.osgi\bundles\ 2 \data
  No registered services.
  No services in use.
  Exported packages
    javax.servlet
;  version="2.4.0"[exported]
    javax.servlet.http ;  version="2.4.0"[exported]
    javax.servlet.resources ;  version="2.4.0"[exported]
  No imported packages
  Host bundles
    org.eclipse.osgi_3
.6.0 .v20100128- 1430   [ 0 ]
  No named class spaces
  No required bundles


最后提供几个本章提到的bundle给大家下载,大家就不用自己再起生成一个了。
javax.servlet_extension_2.4.0.jar
javax.servlet.jsp_extension_2.0.0.jar
org.apache.commons.logging_extension_1.1.1.jar
系统不让传扩展名为.jar的文件,大家下载后把扩展名改改吧,阿门。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值