OSGi Maven開發/部署環境的搭建歷程

          之前的Opendoc中沒有涉及過此部分的內容,maven又是現在非常流行的java的工具,再加上到目前為止搭建OSGi Maven開發和部署的環境還是比較的麻煩,覺得有必要寫篇這樣的blog,:),在這篇blog中來看下如何搭建一個比較好用的OSGi Maven開發和部署環境,看看我在搭建一個這樣的環境中的痛苦歷程。

          首先說下我期望的OSGi Maven開發/部署的環境:
          1、META-INF中的manifest.mf文件可以自己控制;
                Eclipse對插件工程的開發支持的很好了,在IDE中可以很方便的去修改這個manifest.mf,所以還是自己控制更爽,當然,打包的時候需要打入自己控制的這個manifest.mf。
          2、在mvn eclipse:eclipse生成的.classpath中,能夠不把所依賴的bundle的jar包放進去;
                因為在OSGi環境中,已經不再通過直接在project的classpath中依賴其他bundle的jar了來調用其他bundle中的package,而是通過在manifest.mf中增加import-package這樣的方式,所以不能再把依賴的bundle的jar打到classpath里了,否則會很奇怪,當然,這也源于eclipse有個很好的插件開發環境,讓你可以在不依賴bundle jar的情況下直接寫依賴其他bundle的package的代碼。
          3、在mvn clean package的時候能夠把需要依賴的jar打到bundle jar中,并和META-INF/Manifest.mf文件中的Bundle-Classpath是匹配的;
                在某些bundle中可能會依賴一些jar,在META-INF中通常會去指定依賴的這些jar,放入bundle-classpath中,因此要求在打包的時候能夠把這些依賴的jar打入相應的路徑下。

          說完想法后,首先想到的是在OSGi界中支持maven環境的大名鼎鼎的maven-bundle-plugin(http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html),maven-bundle-plugin基于Peter寫的bnd實現,不說廢話了,按照自己期望的環境來使用maven-bundle-plugin進行搭建:

          步驟一
          按照上面頁面的指導,在pom.xml中增加maven-bundle-plugin先,接著按照自己的想法,要自己控制manifest.mf,于是在plugin的configuration中增加:
          <_include>META-INF/MANIFEST.MF</_include>
          滿心歡喜的等待著完美的結果,可惜....不如人意呀,打包出來的jar里面的MANIFEST.MF已經物是人非了,完全不是自己控制的那個,插件給你自動的加上了一堆的import-package、private-package、export-package,我知道這個插件是基于bnd來寫的,但沒想到竟然連自己控制的權力都不給我了,完全仍然是通過bnd來計算出import-package、private-package什么的;

          步驟二
          好,在傷心過后接著仔細看,還好,在plugin的configuration中可以自己指定export-package、private-package這些,于是繼續欣喜的使用,這兩個倒是控制住了,但....import-package自己是不能控制的,這個是不行的,這樣就導致了必須同時自己維護pom.xml以及project中的META-INF/MANIFEST.MF,讓它們保持一致,否則可能導致打出來的包和你在project中運行的表現不一致,并且bnd計算出來的import-package并不是我想要的,有點太復雜了,還是自己控制比較好;

          步驟三
          傷心到極點了,其實到目前為止,已經可以確定maven-bundle-plugin,也是OSGi maven中唯一的插件,不能滿足我的需求,不過還是繼續看看這個插件其他方面的表現,驚喜的發現有一點倒是做的不錯的,它支持一個<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>,有了這個標簽后,它可以直接把依賴的jar打入bundle jar包中,并且相應的自動在bundle-classpath中加上了,這點倒是不錯的,看起來與我期望的環境的第3點是比較匹配的,可惜了。
          還有就是,很當然的,它沒法做到控制mvn eclipse:eclipse時生成的.classpath不包含bundle jar的引用。

          按照上面的三個步驟,總結下,有些時候智能是好事,但maven-bundle-plugin就是過于智能了,為什么不給點權力給使用者呢,因此這個插件要提升到完全可用的情況的話,還需要提供下讓使用者自己控制MANIFEST.MF的權力,相信這點要做到并不困難,而且做到這點后基本也就可以使用了。

          繼續尋找,于是靜心分析了下自己的需求,貌似可以自己通過maven現有的幾個插件來達成自己的愿望,于是開始了組合拳:
          1、MANIFEST.MF文件自己控制
               不就是要自己控制這個文件嘛,OK,干脆,就只用maven-jar-plugin,這個插件允許指定所使用的MANIFEST.MF文件,于是,嘗試著在這個plugin的configuration中增加:
               <archive>
                   <manifestFile>META-INF/MANIFEST.MF</manifestFile>
               </archive>
               恩,很順利,開門紅呀,打出來的jar包中的MANIFEST.MF文件就是自己的那個。
          2、mvn eclipse:eclipse生成的.classpath中要去掉bundle jar的依賴
                對于我這么一個對maven不是那么熟悉的人來講,這個有點復雜,于是不斷的google,甚至是翻看了maven-eclipse-plugin的源碼...
                最終終于功夫不負有心人,找到一個簡單的辦法:
                首先將工程方式指定為pde,也就是eclipse插件工程,在maven-eclipse-plugin的configuration配置中增加<pde>true</pde>;
                然后在pom.xml中將不希望生成到.classpath中依賴的scope指定為provided;
                心驚膽戰的開始運行mvn eclipse:eclipse,OH YEAH!,成功!
                ps: 另外也可以通過在maven-eclipse-plugin的configuration中增加exclude配置,來將某些依賴從.classpath中去掉,當然,這方法沒有上面的易用。
          3、在mvn clean package的時候能夠把需要依賴的jar打到bundle jar中,并和META-INF/Manifest.mf文件中的Bundle-Classpath是匹配的;
                恩,這點,印象中貌似maven是有支持的,于是繼續開始找,終于找到了maven-dependency-plugin(之前還找到了一個maven-shade-plugin,也很帥,不過不滿足需求),通過這個插件可以把需要的依賴的jar都復制到某個指定的目錄中去,但記得把這個指定的目錄加入到maven-jar-plugin的resources目錄里面去,否則這些jar文件是不會出現在你的bundle jar里的。

          OK,通過上面這套組合拳,終于達成了目的,看來有必要找個時間寫個好用點的maven的OSGi插件,否則真的忒折騰了,上面這個方法仍然有幾個痛苦的地方:
          1、如果你的bundle中需要export其中依賴的lib的package的話;
               mvn eclipse:eclipse之后你會發現其他bundle即使import了這個package,也會調用不到,這里的原因在于生成的.classpath中所依賴的那個lib的exported屬性沒有設置為true,google了maven eclipse插件,貌似這是它的一個缺失的功能,因此在目前只能是mvn eclipse:eclipse后,再到build path里把這些lib exported出去。
          2、還是得在插件的pom.xml中配置所依賴的其他的bundle;
               這是為了讓你在mvn clean package的時候能通過,這點還是挺郁悶的,如果能自己去找到的話就好了(Felix構建bundle repo是有潛質做到這點的),:),這樣導致了在每次在import package后,還得記得去修改了pom,否則的話在eclipse compile什么都正常,到了maven里就掛了。
          因此,如果能解決上面兩點的話,那將更加完美。

          posted on 2009-03-05 12:14 BlueDavy 閱讀(16072) 評論(12)  編輯  收藏 所屬分類: OSGi、SOA、SCA

          評論

          # re: OSGi Maven開發/部署環境的搭建歷程 2009-03-05 17:58 papayakov

          下載最新的maven 2.0.10
          mvn archetype:generate
          然后選24,就可以了。
          不過貌似好多dependency下載不成功,repository里面沒有,需要手工調整一下pom.  回復  更多評論   

          # re: OSGi Maven開發/部署環境的搭建歷程 2009-03-05 22:12 lagrustler

          在eclipse下,利用maven做pde開發太費勁了  回復  更多評論   

          # re: OSGi Maven開發/部署環境的搭建歷程 2009-03-10 20:29 wuzhongxing

          請教一下,在linux平臺下,i如果把osg控制臺放到后臺執行之后,還能操作bundle嗎,比如停止bundle、裝載新的bundle?

          我的msn:wu_zhongxing@hotmail.com,謝謝了  回復  更多評論   

          # re: OSGi Maven開發/部署環境的搭建歷程[未登錄] 2009-03-14 13:34 guitarpoet

          對你前兩條的要求不是很理解。

          1、為什么要自己控制POM和MANIFEST兩個文件呢?為什么不把所有的配置信息都放到POM里面,從而生成MANIFEST而要違背DRY法則呢?

          2、我覺得把OSGi工程當作普通java工程來開發也不是什么不可以的事情。

          一般說來,我覺得使用maven來開發OSGi程序還是很方便的。

          Felix的Bundle插件可以自動計算出你需要import的包。這一點有的時候確實有點兒煩人(比如說,我要在我的bundle里面embed一個hibernate的jar,hibernate所有依賴的東西——JTA、DBDrivers、....所有的支持全都加到import配置中去了,實際上我只是想要hibernate中的幾個類而已),而且我沒有看到什么辦法可以解決,我的方式是對jar做自定制,排除掉所有不用的包。  回復  更多評論   

          # re: OSGi Maven開發/部署環境的搭建歷程 2009-03-14 15:05 BlueDavy

          @guitarpoet
          我想對于第一點,我在blog里有寫到過,因為在eclipse里開發直接采用修改MANIFEST.MF的方式會更好用,因此我不希望在pom中維護MANIFEST.MF信息。
            回復  更多評論   

          # re: OSGi Maven開發/部署環境的搭建歷程 2009-08-04 15:45 SQ

          已經可以確定maven-bundle-plugin,也是OSGi maven中唯一的插件.
          ps: 這里有一個:SpringSource Bundlor http://www.springsource.org/bundlor  回復  更多評論   

          # re: OSGi Maven開發/部署環境的搭建歷程 2010-02-08 10:04 spirit14

          bluedavy你好,在了解過利用 Servlet Bridge 將 OSGI 嵌入 WEB容器的方式后,我產生了一個疑問:
          在看到的例子中,被作為插件導入 bridge.war 的 WEB應用(已經被轉換成 jar)其本身就是一個 BUNDLE 。

          但在現實中很多企業需要將原有的 WEB應用向模塊化轉換,而不是新建設一個模塊化的應用,即保護原有的 IT投資。 那么一個以 SPRING ,HIBERNATE, STRUST 作為應用框架的 普通 WEB應用能不能打包成 JAR 直接丟到 bridge.jar 里呢? 還是說要經過什么配置或轉換呢? 謝謝。   回復  更多評論   

          # wsdl+bpel+ode!!! 2010-12-17 18:05 小朱

          我想利用 felix 實現的osgi 最后生成bundle的wsdl文件 ,加上bpel文件(也就是工作流) 通過ode 生成cbp文件, 希望大家提供思路  回復  更多評論   

          # re: OSGi Maven開發/部署環境的搭建歷程[未登錄] 2015-05-19 09:37 John

          http://osgi.jxtech.net 是一個根據標準OSGi的開發平臺,有在線演示和免費插件下載。  回復  更多評論   

          # re: OSGi Maven開發/部署環境的搭建歷程[未登錄] 2015-06-04 08:34 Tom

          @John
          嗯,這個平臺相當優秀,正是我們要找的平臺,能將OSGi用得如此熟練的公司真不多。  回復  更多評論   

          # re: OSGi Maven開發/部署環境的搭建歷程 2015-06-29 19:54 Wick

          @John
          對這個平臺,贊一個,也給你一個贊。  回復  更多評論   

          # re: OSGi Maven開發/部署環境的搭建歷程[未登錄] 2015-09-23 10:27 Gavin

          @guitarpoet
          有些技術問題,真心請教!還請麻煩,我的qq: 729801332

          萬分感謝!!!!!  回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

          <2015年5月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 临泉县| 横山县| 高阳县| 塔城市| 寿宁县| 阳曲县| 石楼县| 张家港市| 诸城市| 北流市| 稻城县| 夹江县| 长丰县| 新闻| 湖北省| 大同市| 雷山县| 锡林浩特市| 太康县| 教育| 博白县| 安泽县| 商城县| 马龙县| 武定县| 葵青区| 丰镇市| 岱山县| 扶绥县| 湖南省| 岳阳市| 嘉兴市| 汝州市| 京山县| 中山市| 铜鼓县| 河北省| 万山特区| 明光市| 文水县| 丹巴县|