OSGi Web Container 簡介

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

已更新: 新增 Git 的版本控制說明。

在過去幾個月裡,我一直與 OSGi Enterprise Expert Group 的 Subbarao Meduri、Graham Charters、Hal Hildebrand 和其他人合作制定 RFC66 Web Container 規範。Web Container 規範定義了如何在 OSGi 服務平台上以標準方式部署 WAR 檔案。

這對我們來說非常有趣,因為 dm Server 支援 WAR 檔案已將近 18 個月,我們很高興能夠朝標準模型邁進。作為終端使用者,您將能夠在 OSGi 上部署 WAR 檔案,而無需依賴專有 API 或功能。

SpringSource 負責編寫 Web Container 參考實作,而我在過去幾週一直在從事這項工作。在本部落格中,我將描述 Web Container 規範的主要功能,並討論您開始使用 RI 程式碼所需的步驟。我沒有被允許發布規範文件,但我會概述最重要的重點。

目前,RI 沒有二進制發行版,但從原始碼建置開始非常容易。

Web Container 的主要功能

Web Container 支援的最有趣功能包括

  • WAR 檔案的安裝
  • Web 應用程式套件 (WAB) 的安裝
  • 使用擴充器進行 Web 應用程式生命週期控制
  • 使用 URL 參數控制組態屬性

安裝 WAR 檔案

對我而言,Web Container 最令人興奮的功能是能夠直接將 WAR 檔案部署到 OSGi 中,*而無需更改您的程式碼*。(使用 JNDI 的 WAR 檔案無法在不更改程式碼的情況下使用,因為 JNDI 目前不是規範的一部分。目前正在進行修復此問題的工作,因此我不認為此限制會永遠存在。)

若要將 WAR 檔案安裝到 OSGi 中,您只需在呼叫 BundleContext.installBundle 或使用平台控制台時,在檔案位置前加上 webbundle:。例如,在 Equinox 中,我可以這樣做

install webbundle:file:formtags.war

當然,這需要您在 OSGi 平台上安裝 Web Container 實作。

Web Container 會對 WAR 執行各種轉換,以確保它具有符號名稱、版本以及運作所需的必要匯入。Web Container 也會更新套件組合類別路徑,以新增 WEB-INF/classesWEB-INF/lib 中的每個 JAR 檔案。

安裝 Web 應用程式套件 (WAB)

如果您不想依賴 Web Container 來轉換您的 WAR 檔案,那麼您可以完全繞過轉換階段。只需自行新增適當的 manifest 標頭並直接安裝套件組合,省略 webbundle 協定即可。

WAB 的套件組合類別路徑上不能有任何不在 WEB-INF 下的項目。這是為了防止您的任何應用程式類別作為資源在您的網路應用程式中可見。WAB 可能會出現其他限制,但這些限制尚未最終確定。

使用擴充器進行生命週期控制

Web Container 使用 擴充器模型來控制網路應用程式生命週期。網路應用程式在對應的套件組合啟動時啟動,並在該套件組合停止時停止。

在 Equinox 中,這表示我可以直接從控制台啟動和停止我的網路應用程式。例如,如果上面的 formtags.war 套件組合被賦予套件組合 ID 50

start 50 ... Tomcat 輸出 ... stop 50

使用 URL 參數控制組態

WAR 檔案組態可以透過將某些支援的組態屬性附加到安裝 URL 來控制。

例如,若要控制網路應用程式的 context path,您可以新增 Web-ContextPath 選項

install webbundle:file:formtags.war?Web-ContextPath=ftags

或控制產生的 Bundle-SymbolicName 標頭

install webbundle:file:formtags.war?Bundle-SymbolicName=ftags.bundle

Web Container 和 dm Server

Web Container RI 中的程式碼大多取自 dm Server 中的程式碼並受其啟發。但是,RI *不需要*完整的 dm Server。我們將用 Web Container RI 取代 dm Server 中目前的網路程式碼,我們也將採用 Web Container 作為在 OSGi 上建置網路應用程式的建議方法。

參考實作簡介

Web Container RI 使用 Tomcat 作為 servlet 容器實作。RI 本身由四個套件組合組成。core 套件組合包含所有與 servlet 容器無關的程式碼。tomcat 套件組合包含 Tomcat 特有的程式碼。tomcat.fragment 套件組合包含預設的 Tomcat 組態,並作為片段附加到 Tomcat Catalina 套件組合。extender 套件組合包含所有擴充器行為,如果您希望手動管理網路應用程式生命週期,則可以移除它。

建置參考實作

若要開始使用 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 Container 並安裝一些 WAR 檔案。

執行參考實作

我正在使用 PAX Runner 來執行 Web Container RI。我的 PAX Runner 組態使用已建置的二進制檔案和 Ivy 管理的依賴項來執行 Web Container。

build-web-container 目錄中,您會找到一個名為 runner.bundles 的檔案。此檔案可用於指示 PAX Runner 安裝 Web Container 所需的所有套件組合

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 套件組合 ID 為 48 start 48

執行 start 後,我收到一個錯誤,抱怨 ClassNotFoundException,原因是 org.xml.sax 套件中的某些類別。這裡的問題是 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 套件組合 ID 為 49 start 49

在這裡,我指定 FormTags 應用程式所需的額外套件匯入。這次,此應用程式成功啟動,並且可以從網頁瀏覽器中的 https://127.0.0.1:8080/formtags 存取。

在 dm Server 中,WAR 檔案會匯入系統套件組合匯出的每個套件,這表示常見的系統類型會自動可用。我認為這是一個有用的功能,我很想知道您是否同意,或者您是否更喜歡手動控制對系統套件的存取權。

下一步?

Web Container 規範仍在發展中,我正在努力使 RI 與之同步。我正在努力將 dm Server 遷移為使用 Web Container RI 來取代其自身的網路支援,並且我將在未來幾週內對此發表更多看法。

取得 Spring 電子報

隨時關注 Spring 電子報

訂閱

領先一步

VMware 提供訓練和認證,以加速您的進展。

瞭解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進制檔案。

瞭解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

檢視全部