Capsule:JVM的打包佈署開源工具

Capsule自已所介紹,打包與發佈Java應用程式。
我的第一個印象是:包裝一個可執行Jar檔,不是很簡單的事嗎?
存在即是合理,要是有其必要之處。

她的原理很簡單
  1. 把可執行Jar檔的啟動Class換成她的:Capsule
  2. 照後這個Class依照設定來啟動您的程式(執行相關所需的環境變數、參數全部記載在MANIFEST內)

她把執行的行為分為六種(Caplets),我覺的重要的至少有兩種:

capsule-shield:把程式打包,乍看之下沒什麼,可是對於JNI程式就很有用處了,因為我們沒有辦法把JNI所需的Library與可執行Jar 綁在一塊,而且執行時一般得還得傳入 -Djava.library.path參數指定Native Library所在的位置才能順利執行,可是透過Capsule卻可以解決這個問題(這裡有個包JNI的Jar(Linux或Windows)檔,可以直接下載執行)

capsule-maven也是個重要的Caplets,程式打包通常的作法是把所有會用到Jar Library解開後再一起打成一包,會產生所謂的Fat Jar(檔案比較大),而capsule-maven讓我們把程式delivery時,不用包含這些相關的Jar Library,而只交付所謂的 thin jar(不含其它Library),然後在Runtime(執時)階段時再來下載這些Library。

capsule-desktop:用來執行GUI程式,說實在的看不出來有什麼特別
capsule-secure:沒試過,她的描述是: 以設定的安全政策在Java的沙盒中執行
capsule-osv:也沒試過,說是用來打包程式在OSv microkernel雲端執行。

MANIFEST說明

先來一個最簡單的lwjgl.Jar打包說明(Fat-Jar):
註:Native Library必須跟Capsule.class放在第一層,不要想在MANIFEST.MF自訂java.library.path,因為Capsule執行時會代入java.library.path直接蓋過你的設定。
Fat-Jar檔內的MNAIFEST.MF內容
Main-Class: Capsule
這是程式執行的進入點,所以必須把Capsule.class(解開Capsule.jar)
Application-Class: your.class.name
你的程式的進入點,完整的class name
然後用java -jar lwjgl.Jar就可以直接執行程式

註:在Mac或是Linux下可以用以下指令把Jar檔直接打包成一個可執行檔
echo -e '#!/bin/sh\n\nexec java -jar "$0" "$@"\n\n' > lwjgl.x
cat lwjgl.x lwjgl.jar > lwjgl.run
chmod u+x lwjgl.run
./lwjgl.run

再來要說明的是Thin-jar:

Thin-Jar檔內的MNAIFEST.MF內容
Main-Class: Capsule
這是程式執行的進入點,所以必須把Capsule.class(解開Capsule.jar)
Premain-Class: Capsule
指定Java-agent,會先在你的程式前執行,這裡的做用就是執行前先去的Maven的Repo下載相關Library
Caplets: co.paralleluniverse:capsule-maven:1.0
必須指指定capsule-maven的maven識別資訊,除非把該Jar解開放在執行的Jar中,才可用”Caplets: MavenCapsule”,因為上面圖片中的capsule-maven-1.0.jar並未解開,所以必須指定Maven識別
Repositories:central
可省略,預設為Maven central repository,可以空白分隔指定多個repository,詳情參考官方說明
Application: org.eclipse.jetty:jetty-runner:9.2.13.v20150730
因為這個Package的執行進入點在Maven函式庫中(這個範例使用jetty-runner來執行這個war程式),所以必須指定下載,若是您的可執行Jar檔也能發佈到外部repository,Thin-jar甚至不必包含您的程式而變成更精簡的 Empty-Jar
Application-Class: org.eclipse.jetty.runner.Runner
指定程式的進入點(此處為jetty-runner的程式進入點)
Dependencies: javax.transaction:jta:1.1 com.h2database:h2:1.4.189 com.
atomikos:transactions-jta:4.0.0M4 com.atomikos:transactions-jdbc:4.0.
0M4 org.slf4j:slf4j-simple:1.7.12
指定執行程式所須相依的函式庫(以空格分開),在程式執行前一併下載
Args: --config $CAPSULE_DIR/WEB-INF/jetty.xml $CAPSULE_JAR
程式執行時(這裡指 jetty-runner)所需要代入的參數,$CAPSULE_DIR指war檔解開的cache目錄(因為我把設定檔打包在war檔內), $CAPSULE_JAR指的就是這個war檔案
Allow-Snapshots: true
相依函式庫若有版本為snapshot時是否引用
其它可用Attribute強力建議去看看官方文件

關於如何打包程式請參考我的設定或是搞懂了上面這些參數,也可以而用第三方capsule-maven-plugin來打包

留言

這個網誌中的熱門文章

企業人員的統一管理-FreeIPA學習筆記

證交所最佳五檔的程式解析

Postgresql HA