在PowerShell上執行Pax Construct還不賴,它提供的介面比cmd好看多了。在PowerShell上執行OSGi興許有不一樣的火花。Pax Construct提供兩個script:pax-embed-jar和pax-wrap-jar把Jar包成bundle。

  Bundle在OSGi裡最簡單的定義是一個普通的jar加個額外的資訊檔,即META-INF下的MANIFEST.MF。而要介紹的這兩個script,甚至可以幫忙從Jar檔找出相依(dependencies)的Jar,generate MANIFEST.MF的資訊。

  pax-embed-jar和pax-wrap-jar從其名稱判斷兩者差別:Embed Jar是把相依的Jar全涵蓋進來包成一個bundle,這些dependencies只屬這個bundle,所以它需在bundle目錄下執行,即由pax-create-bundle所建的目錄,相當WAR檔結構;而Wrap Jar則是在pax-create-project所建的目錄下執行,一個project可有數個bundle,依賴共同的dependencies,是故當dependencies有所變動,相依的Bundle都得重新編譯,感覺像沒有用到OSGi的特點,但在開發家族系列的Bundle就有需要。

  Pax Construct能自動生成MANIFEST.MF的資訊,在執行pax-create-project或pax-create-bundle後。switch到bundle目錄下,執行:

pax-embed-jar -g org.compass-project -a compass -v 2.2.0

  就會把來自org.compass-project的compass的jar檔內嵌到bundle目錄/target/pax-eclipse下,同時也改變了bundle目錄下的osgi.bnd內容。而compass又會牽拖一大堆目前還不需要用到的jar檔,如Spring、TopeLink、Hibernate等,怎麼辦?在osgi.bnd裡再加一行如下面的粗體字:

Embed-Dependency: compass;groupId=org.compass-project;inline=false
Import-Package: *;resolution:=optional

  這樣在進行mvn clean install包出的bundle jar不會因為找不到dependencies而無法編譯成功。

  再switch到上一層的project目錄,執行:

pax-wrap-jar -g org.compass-project -a compass -v 2.2.0

  和上個語法完全一樣,但output目錄不同,dependencies jar檔compass和bundle jar均產出到project目錄下的runner/bundles下,而compass在wrap也有和embed一樣的問題,因為執行上述script後,會在project目錄多出一個org.compass-project.compass的子目錄,按指定group ID.artifact ID產出,其目錄下也有個osgi.bnd,也可以在再加一行一樣的內容如下:

Embed-Dependency: *;scope=compile|runtime;type=!pom;inline=true
Import-Package: *;resolution:=optional

  從這裡看出,wrap jar因為dependencies要被數個bundle共用,是故獨立出一個子目錄方便進行生成MANIFEST.MF。而embed jar的dependencies則跟著bundle目錄走。

arrow
arrow
    全站熱搜

    Jemmy 發表在 痞客邦 留言(0) 人氣()