隨筆 - 19, 文章 - 1, 評論 - 21, 引用 - 0
          數據加載中……

          打造一個基于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,內容如下:
           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:
           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
           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容器中已經可用了:
          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的文件,大家下載后把擴展名改改吧,阿門。

          posted on 2010-03-24 22:49 dbstar 閱讀(4647) 評論(2)  編輯  收藏 所屬分類: OSGi

          評論

          # re: 打造一個基于OSGi的Web Application——為OSGi容器提供Web Application環境  回復  更多評論   

          拜讀了,呵呵
          2010-05-26 11:37 | hesy

          # re: 打造一個基于OSGi的Web Application——為OSGi容器提供Web Application環境  回復  更多評論   

          @hesy
          是否可以使用map.put("org.osgi.framework.bundle.parent", "framework");
          這種形式呢? 是不是這種形式與上面的某種是一樣的
          2010-11-22 11:17 | whitewolf
          主站蜘蛛池模板: 长葛市| 彝良县| 金门县| 日喀则市| 绵阳市| 东源县| 仙游县| 长海县| 灌云县| 静乐县| 田阳县| 永平县| 眉山市| 贵德县| 南开区| 噶尔县| 达日县| 墨脱县| 眉山市| 南乐县| 容城县| 浮山县| 安顺市| 禹城市| 临汾市| 南江县| 郑州市| 格尔木市| 遂川县| 叶城县| 阿鲁科尔沁旗| 宾阳县| 交口县| 海丰县| 丹寨县| 车险| 高邮市| 绥芬河市| 微山县| 诸暨市| 苍南县|