我們上次開發了包含本地服務和遠端服務兩個插件的pulg-in項目,并且學習了如何注冊和擷取service,如何綁定http服務,如何綁定servlet服務。
接下來我們依舊使用osgi技術,将項目改為使用spring注入技術的項目。
說到這裡不得不介紹一下spring-dm:
spring-dm指的是 spring dynamic modules。spring-dm 的主要目的是能夠友善地将 spring 架構和osgi架構結合在一起,使得使用spring的應用程式可以友善簡單地部署在osgi環境中,利用osgi架構提供的服務,将應用變得 更加子產品化。
是以我們接下來要做的就是spring-dm與osgi的結合。
可以從 spring 的網站上下載下傳最新的 spring-dm 包。目前最新的版本為 1.2.0 rc1,下載下傳位址在:
http://download.csdn.net/detail/u013517797/9463540
下載下傳了這個spring-dm 包後,我們把壓縮包中的dist和lib目錄解壓到硬碟上的某個目錄,比如解壓到d盤根目錄下的 spring-dm 目錄中。那麼我們會在d:\spring-dm\dist目錄下看到如下圖所示的内容。
在d:\spring-dm\lib中看到如下圖所示的内容。
然後我們要在我們的項目中引入需要的spring插件,我們點選import,然後選擇 import plugin-ins and fragments:
然後做一下設定
我們要設定 plug-in location,先設定為 d:\spring-dm\dist,導入 sprimg-dm 的包:
點選 next 後,出現了讓我們選擇導入的plugin界面
我們可以導入 core、extender、io 三個 bundle。
完成後可以在eclipse的工作區看到引入的三個插件:
我們直接在 run configurations 中選擇這三個 bundle,并執行,會發現三個 bundle 都是installed狀态,如果我們啟動bundle,會報錯,原因是我們沒有加入這三個bundle所依賴的bundle。而這些bundle,也就在d:\spring-dm\lib目錄下。我們用和前面一樣的方式來導入lib中所需要的bundle。
要 導 入 的 bundle 是
com.springsource.org.aopalliance
org.springframework.aop
org.springframework.beans
org.springframework.context
org.springframework.context.support
org.springframework.core
導入完之後我們在eclipse的工作區看到引入的插件:
我們再次配置一下run configurations:
(單純的,我們自己的加了更多需要的插件)
然後我們将此環境運作起來,然後出現如下畫面就是我們的環境配置成功:
然後我們輸入ss指令,發現我們的環境中的spring插件全部active:
我們的環境配置完成之後,接下來我們開始改造我們的翻譯助手項目。
首先改造我們的本地查詢服務,我們在localtranslateasslt的manifest.mf導入我們需要的插件依賴:
javax.servlet;
javax.servlet.http;
org.osgi.service.http;
然後将本工程下的activator類删除(我們接下來将不通過activator來注入service和擷取service了,我們通過spring的注入來注冊和擷取相應的服務),并在manifest.mf中删除bundle-activator:選項。
然後我們在工程下建立一個名為“osgi-inf”的檔案夾,然後建立一個名為“component.xml”的xml配置檔案:
然後在manifest.mf中添加service-component: osgi-inf/component.xml這句話(如果報"header must be terminated by a line break"的錯,在上面那個配置末尾加一個回車就好了)。
這個檔案就是配置我們該插件項目注冊的service,其中的内容為:
可以看到,我們注冊了一個名為"translateservice"的service,這個service的執行個體化類為"com.zyg.osgi.localtranslateasslt.impls.translateservicelocalimpl"。
同理,我們在遠端服務插件中做相同的操作,先加入相應的依賴(javax.servlet;javax.servlet.http;org.osgi.service.http;),然後删除activator類,然後在manifest.mf中删除bundle-activator:選項,并建立osgi-inf的檔案夾與component.xml配置檔案,然後在manifest.mf中添加service-component: osgi-inf/component.xml這句話。接着在配置檔案中寫入如下配置:
最後我們修改我們的web入口插件translateclient,先加入相應的依賴(javax.servlet;javax.servlet.http;org.osgi.service.http;),然後删除其activator類,然後在manifest.mf中删除bundle-activator:選項,并建立osgi-inf的檔案夾與component.xml配置檔案,然後在manifest.mf中添加service-component: osgi-inf/component.xml這句話。接着在component.xml寫入以下配置:
可以看到我們配置了servlet和servlet的實作,然後裡面的參數是servlet依賴的類,分别是translateservice和httpservice。
然後我們修改一下translateserviceservlet,讓其能夠通過配置檔案注入translateservice和httpservice:
我們配置一下run configuration,在之前的基礎上,将我們的項目的四個部分全部引入進去(localtranslateasslt、remotetranslateasslt、translateasslt、translateclient)
如果出現java.lang.classnotfoundexception:等錯誤,應在target platform中加入等工程中需要的依賴插件。
我們現在運作一下我們的項目:
說明我們的項目運作成功,那麼使用ss指令發現我們的插件都是運作正常 的,那麼我們先停掉我們的遠端服務
測試一下本地服務:
可以看到本地服務查詢是正常的,遠端服務查詢是停掉的。
然後停掉我們的本地服務,啟動遠端服務:
測試一下遠端服務:
可以看到遠端服務查詢是正常的,本地服務查詢是停掉的。
至此,我們的osgi和spring-dm整合成功。
轉載請注明出處:http://blog.csdn.net/acmman/article/details/50935373