初探OSGi Web容器:控制Web程序的生命周期
原創(chuàng)【51CTO快譯】最近幾個月,我在與 OSGi 專家組的人員合作,制定Web 容器的 RFC66 規(guī)范。Web 容器規(guī)范定義了 OSGi 服務(wù)器平臺上 WAR 文件的實施標(biāo)準。
51CTO編輯推薦:OSGi入門與實踐全攻略
這項工作非常有趣,因為 dm 服務(wù)器對 WAR 文件的支持已將近 18 個月;我們非常興奮能夠一起努力來推出一個標(biāo)準。 作為終端用戶,你將不再需要依靠專用的 API 接口或功能就可以在 OSGi 上部署 WAR 文件。SpringSource 負責(zé)編寫 Web 容器的參考實現(xiàn),過去幾周,我一直在忙這件事。
本文講述了 Web 容器規(guī)范最主要的內(nèi)容以及編寫 RI 代碼所需的步驟?,F(xiàn)在還不能提供規(guī)范文檔,但我會概述其中最重要的要點。
目前,還沒有發(fā)布 RI 的二進制文件,但通過從源文件進行創(chuàng)建是非常容易的。
Web 容器的主要功能
Web 容器所支持的最有趣的功能:
◆WAR 文件的安裝
◆Web 應(yīng)用程序組件(Web Application Bundles:縮寫為 WAB)的安裝
◆利用擴張器對 Web 應(yīng)用程序生命周期的控制
◆利用 URL 參數(shù)對配置屬性的控制
安裝 WAR 文件
對我而言,Web 容器最有趣的功能是在 OSGi 上直接部署 WAR 文件而無需修改代碼。(由于 JNDI 面前還未包含在規(guī)范中,因此使用的 JNDI 的 WAR 文件還需要修改代碼。我認為這種限制不會一直存在,解決這個問題的工作正在進行。)
想要在 OSGi 上安裝 WAR 文件,你只需在調(diào)用 BundleContext.installBundle 或使用平臺的控制器時,在文件位置前添加 webbundle:。例如,在 Equinox 中可以這樣做:
install webbundle:file:formtags.war |
當(dāng)然,這要求 OSGi 平臺已經(jīng)部署 Web 容器。
Web 容器將對 WAR 執(zhí)行多個轉(zhuǎn)換,以確保獲取了正常運行所需的符號名和版本以及必要的導(dǎo)入。為了添加 WEB-INF/classes 和WEB-INF/lib 中的所有文件,Web 容器還將更新組件路徑。
安裝 Web 應(yīng)用程序組件(WAB)
如果你不想使用 Web 容器對 WAR 進行轉(zhuǎn)換,完全可以跳過這個轉(zhuǎn)換步驟。很簡單,你可以忽略 webbundle 協(xié)議,自己直接添加相應(yīng)的聲明頭文件并安裝該組件。
在 WAR 套件路徑下不能包含任何不屬于 WEB-INF 的條目。這是為了防止用戶的應(yīng)用程序類在 Web 程序中顯示為可見的資源文件。這可能為 WAR 帶來更多限制,不過這個文問題正在解決。
利用擴展器控制生命周期
Web 容器使用控制器模型控制 Web 程序的生命周期。Web 應(yīng)用程序在相應(yīng)的組件啟動時啟動,并當(dāng)該組件停止時停止。
在 Equinox 中,這意味著我可以直接從控制臺啟動或停止我的 Web 程序。例如,指定上述的 formtags.war 組件的組件 ID 為 50:
start 50 |
使用 URL 參數(shù)控制配置
WAR 文件的配置可通過在安裝 URL 后添加某些特定的配置屬性來控制。
例如,為了控制 Web 程序的環(huán)境路徑,你可以添加 Web-ContextPath 選項:
install webbundle:file:formtags.war?Web-ContextPath=ftags |
或者,為了控制生成的 Bundle-SymbolicName 頭文件:
install webbundle:file:formtags.war?Bundle-SymbolicName=ftags.bundle |
#p#
Web 容器和 dm 服務(wù)器
Web 容器 RI 中代碼大部分來自 dm 服務(wù)器中,或根據(jù)其中的代碼改寫,但是 RI 并不要求完整的 dm 服務(wù)器。我們會將 dm 服務(wù)器中當(dāng)前的網(wǎng)頁代碼替換為 Web 容器 RI,另外,我們還會將 Web 容器作為在 OSGi 上創(chuàng)建 Web 程序的推薦方法。
參考實現(xiàn)介紹
Web 容器 RI 使用 Tomcat 作為 servlet 容器實現(xiàn)。RI 本身由四個組件構(gòu)成。core bundle 包含所有獨立于 servlet 容器的代碼。tomcat 組件包含所有 Tomcat 專用代碼。tomcat.fragment 組件包含缺省的 Tomcat 配置并作為碎片附加到 Tomcat Catalina 組件。extender bundle 包含所有擴展器行為,并且如果你選擇手動管理 Web 程序的生命周期,可以將其刪除。
創(chuàng)建引用實現(xiàn)
為了運行 RI,你需要從源文件中進行創(chuàng)建。源文件可以直接從 SVN 獲?。?/P>
svn co https://anonsvn.springsource.org/svn/dm-server-osgi-web-container/trunk |
一旦獲得了這些代碼,你就可以使用以下命令進行創(chuàng)建:
cd build-web-container |
如果測試失敗,請使用 JIRA 提交故障。創(chuàng)建成功之后,你就可以運行 Web 容器并安裝一些 WAR 文件。
運行參考實現(xiàn)
我使用 PAX Runner 運行 Web 容器 RI。我的 PAX Runner 配置利用創(chuàng)建的二進制文件和 Ivy 管理的相關(guān)性來運行 Web 容器。
在 build-web-container 目錄中,你可以找到一個名為 runner.bundles 的文件。利用這個文件可指示 PAX Runner 安裝 Web 容器需要的所有組件:
pax-run –platform=equinox –snapshot runner.bundles |
該命令使用 PAX Runner 啟動 Equinox。–snapshot 標(biāo)記用來指示 PAX Runner 下載 Equinox ***的穩(wěn)定版本——部署了***公布的 OSGi 4.2 規(guī)范。
一旦 Equinox 啟動并發(fā)出 ss 命令驗證組件已經(jīng)安裝,你就可以看到所有已安裝和運行的 45 個組件。
安裝應(yīng)用程序
我使用 dm 服務(wù)器的 FormTags WAR 示例進行測試。
我試圖直接安裝 FormTags 程序,但結(jié)果沒有出現(xiàn)預(yù)期的結(jié)果:
install webbundle:file:formtags.war |
運行啟動之后,出現(xiàn)錯誤,顯示與 org.xml.sax 包中某些類的 ClassNotFoundException 有關(guān)。
出現(xiàn)這種故障是因為在缺少情況下只為 WAR 文件提供了四個導(dǎo)入:
javax.servlet、javax.servlet.http、javax.servlet.jsp 和javax.servlet.tagext。
使用 Import-Package URL 參數(shù)就可以很容易地解決這個問題:
uninstall 48 |
這里我指定了 FormTags 程序所需的額外的包導(dǎo)入。這次程序成功啟動,并且可以在瀏覽器中通過 http://localhost:8080/formtags 訪問。
在 dm 服務(wù)器中,對于由系統(tǒng)組件導(dǎo)出的每個包,WAR 文件獲得一個導(dǎo)入。這表示對于普通的系統(tǒng)包是自動可用的。我認為這是一個有用的功能。你是否也這樣認為?或者更愿意手動控制對系統(tǒng)包的訪問?
總結(jié)
Web 容器的規(guī)范仍在改進;我盡量讓 RI 保持同步。目前我正在對 dm 服務(wù)器進行修改,試圖讓它使用 Web 容器 RI 而不是它自身的網(wǎng)頁支持。在后續(xù)文章中,我會提供更多相關(guān)的信息。
譯者:司馬牽牛
【編輯推薦】