OSGi Web 容器簡介

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

更新:添加了 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容器的主要功能

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容器還會更新bundle classpath,以新增WEB-INF/classesWEB-INF/lib中的每個JAR檔案。

安裝Web應用程式包 (WAB)

如果您不想依賴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引數控制配置

可以透過將某些支援的配置屬性附加到安裝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本身由四個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.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://:8080/formtags

在dm Server中,WAR檔案會匯入系統bundle匯出的所有包,這意味著常見的系統型別會自動可用。我認為這是一個有用的功能,我很想知道您是否同意,或者您更喜歡手動控制對系統包的訪問。

下一步是什麼?

Web容器規範仍在發展中,我正在努力使RI保持同步。我正在努力將dm Server遷移到使用Web容器RI而不是它自己的web支援,未來幾周我將對此有更多說明。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有