領先一步
VMware 提供訓練和認證,以加速您的進展。
瞭解更多已更新: 新增 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 支援的最有趣功能包括
若要將 WAR 檔案安裝到 OSGi 中,您只需在呼叫 BundleContext.installBundle 或使用平台控制台時,在檔案位置前加上 webbundle:。例如,在 Equinox 中,我可以這樣做
install webbundle:file:formtags.war
當然,這需要您在 OSGi 平台上安裝 Web Container 實作。
Web Container 會對 WAR 執行各種轉換,以確保它具有符號名稱、版本以及運作所需的必要匯入。Web Container 也會更新套件組合類別路徑,以新增 WEB-INF/classes 和 WEB-INF/lib 中的每個 JAR 檔案。
如果您不想依賴 Web Container 來轉換您的 WAR 檔案,那麼您可以完全繞過轉換階段。只需自行新增適當的 manifest 標頭並直接安裝套件組合,省略 webbundle 協定即可。
WAB 的套件組合類別路徑上不能有任何不在 WEB-INF 下的項目。這是為了防止您的任何應用程式類別作為資源在您的網路應用程式中可見。WAB 可能會出現其他限制,但這些限制尚未最終確定。
Web Container 使用 擴充器模型來控制網路應用程式生命週期。網路應用程式在對應的套件組合啟動時啟動,並在該套件組合停止時停止。
在 Equinox 中,這表示我可以直接從控制台啟動和停止我的網路應用程式。例如,如果上面的 formtags.war 套件組合被賦予套件組合 ID 50
start 50 ... Tomcat 輸出 ... stop 50
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 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.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 套件組合 ID 為 49 start 49
在這裡,我指定 FormTags 應用程式所需的額外套件匯入。這次,此應用程式成功啟動,並且可以從網頁瀏覽器中的 https://127.0.0.1:8080/formtags 存取。
在 dm Server 中,WAR 檔案會匯入系統套件組合匯出的每個套件,這表示常見的系統類型會自動可用。我認為這是一個有用的功能,我很想知道您是否同意,或者您是否更喜歡手動控制對系統套件的存取權。
Web Container 規範仍在發展中,我正在努力使 RI 與之同步。我正在努力將 dm Server 遷移為使用 Web Container RI 來取代其自身的網路支援,並且我將在未來幾週內對此發表更多看法。