與傳統(tǒng)J2EE應(yīng)用開發(fā)相比,OSGi 開發(fā)中最便利的地方就是可以直接在Eclipse 中進(jìn)行調(diào)試。想起幾年前在開發(fā)環(huán)境中與應(yīng)用服務(wù)器集成開發(fā)調(diào)試遇到的麻煩,頓時(shí)感覺(jué)OSGi真是個(gè)好東西。不過(guò)應(yīng)用最終還是要打包成 war 文件然后部署到應(yīng)用服務(wù)器上去運(yùn)行的。雖然當(dāng)前的應(yīng)用服務(wù)器都開始聲稱支持OSGi,但是似乎都不支持OSGi 應(yīng)用的直接部署。我們?nèi)匀恍枰ㄟ^(guò)Equinox在容器內(nèi)構(gòu)建一個(gè)內(nèi)部的OSGi 環(huán)境,然后使用servlet bridge 在web容器和OSGi 環(huán)境之間進(jìn)行http 的轉(zhuǎn)發(fā)。
將OSGi 應(yīng)用打成war包的方法在eclipse equinox網(wǎng)頁(yè)上已經(jīng)有介紹:http://www.eclipse.org/equinox/server/http_in_container.php, 如下圖所示:
在部署自己的應(yīng)用中,plugins 目錄下包含如下bundle:
感覺(jué)要成功部署OSGi應(yīng)用,關(guān)鍵是確定plugins 目錄下要包含哪些bundles。
本人在部署OSGi應(yīng)用的時(shí)候遇到了幾個(gè)問(wèn)題:
1. 要加入org.apache.commons.logging_1.0.4.jar,否則spring-osgi-extender-1.0.jar 中的budle org.springframework.bundle.osgi.extender 無(wú)法正常start
2. 不要加入org.eclipse.equinox.http.jetty,否則web應(yīng)用無(wú)法成功運(yùn)行。Jetty是我們?cè)贓clipse 中調(diào)試時(shí)使用的仿web容器,因此不能將其打包到war文件中去。
3. 所有bundle在部署之后默認(rèn)處于Resolved狀態(tài),如果不將他們啟動(dòng),則應(yīng)用無(wú)法正常運(yùn)行。我是通過(guò)在自己的一個(gè)應(yīng)用bundle中將所有bundle啟動(dòng)來(lái)做的,方法請(qǐng)參考我的前一篇blog。