領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多更新:添加了 Git 的版本控制說明。
在過去的幾個月裡,我一直與 Subbarao Meduri、Graham Charters、Hal Hildebrand 以及來自 OSGi 企業專家組的其他成員一起致力於 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容器還會更新bundle classpath,以新增WEB-INF/classes和WEB-INF/lib中的每個JAR檔案。
如果您不想依賴Web容器轉換您的WAR檔案,那麼您可以完全跳過轉換階段。只需自己新增適當的manifest頭,然後直接安裝bundle,省略webbundle協議。
WAB的bundle classpath上不能有任何不在WEB-INF下的條目。這是為了防止您的任何應用程式類在Web應用程式中可見為資源。WAB可能還會出現其他限制,但這些尚未最終確定。
Web容器使用擴充套件器模型來控制Web應用程式生命週期。當相應的bundle啟動時,Web應用程式啟動;當該bundle停止時,Web應用程式停止。
在Equinox中,這意味著我可以直接從控制檯啟動和停止我的Web應用程式。例如,如果上面formtags.war bundle的bundle ID是50
start 50 ... Tomcat output ... 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本身由四個bundle組成。core bundle包含所有與servlet容器無關的程式碼。tomcat bundle包含Tomcat特定的程式碼。tomcat.fragment bundle包含預設的Tomcat配置,並作為片段附加到Tomcat Catalina bundle。 extender bundle包含所有擴充套件器行為,如果您更喜歡手動管理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容器所需的所有bundle
pax-run --platform=equinox --snapshot runner.bundles
此命令使用PAX Runner啟動Equinox。--snapshot標誌告訴PAX Runner下載最新流穩定版本的Equinox——一個實現了最新已知OSGi 4.2規範的版本。
Equinox啟動後,發出ss命令以驗證bundle是否已安裝,您應該會看到大約45個bundle已安裝並正在執行。
我正在使用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://:8080/formtags。
在dm Server中,WAR檔案會匯入系統bundle匯出的所有包,這意味著常見的系統型別會自動可用。我認為這是一個有用的功能,我很想知道您是否同意,或者您更喜歡手動控制對系統包的訪問。
Web容器規範仍在發展中,我正在努力使RI保持同步。我正在努力將dm Server遷移到使用Web容器RI而不是它自己的web支援,未來幾周我將對此有更多說明。