2008年11月22日 星期六

簡易佈署java程式

如果各位有安裝Java Runtime Environment(JRE)的話,一定會發現有一個東西叫做Java Web Start。這是一個很powerful的java程式佈署工具,包含在JRE裡;如果需要java的應用程式,可以直接利用他來呼叫。被Java Web Start呼叫的程式通常被包成 .jar,這是一個壓縮程度類似tar.gz的壓縮格式。本文主要針對製作jar作簡單筆記。

1. 包成類別庫:

假設當前的工作目錄為~/java-workspace/NewJob,其下有一個主類別TestNewjob.java,兩個套件(folder)跟類別分別是:

work1/Job1.java
work2/Job2.java
包覆成jar類別庫時,當然要先編譯出class檔出來;編譯主類別前,需要注意javac能否找到非預設套件下的兩個類別:
javac -sourcepath . -d classes TestNewjob.java
將sourcepath指定到當前目錄,javac會自動找尋當前目錄下的所有資料夾當成搜尋套件的PATH。注意上面的-sourcepath不能簡寫成-sp。編譯成功後會在~/java-workspace/NewJob裡面多出:
classes/TestNewjob.class
classes/work1/Job1.class
classes/work2/Job2.class
這時請切換工作目錄到classes裡面來。包覆java類別庫的指令為jar(詳情請man jar):
cd classes
jar -cvf TestNewjobLib.jar work1/ work2/
熟悉linux tar指令的人一定很愛這種命令,感覺好像本來就會了一樣!
包完之後的java類別庫並沒有可以啟動程式的主類別(所以才叫做類別庫^^),因此要執行必須指定主類別名稱:
java TestNewjobLib.jar TestNewjob
我們會發現執行失敗。雖然我們現在的環境變數已經在這個路徑了,不過還是會要求說找不到main方法的入口,這時我們利用-classpath來指定:
java -classpath TestNewjob.jar:. TestNewjob
便可以成功執行。利用":."來指定多個路徑,也就是在當前目錄下同時存在類別庫跟主類別時的執行方法。

請注意在殘障作業系統(Windows)內,指派多個路徑的方式則是利用分號(;)

java -classpath TestNewjob.jar;. TestNewjob

2. 包覆成可執行程式:
雖然說是可執行程式,但具體而言她還是一個jar的壓縮檔;不同的是主類別也包覆進去,因此無須費力的指定classpath。
之前的環境是相同的,之後作法才開始不同。
在~/java-workspace/NewJob/classes裡,須新增一個檔案,假設為manifest.mf,裡面新增一行:

Main-Class: TestNewjob
(如果是windows平台,則需要再多一行空白行,原因是因為windows跟unix-like系統的換行定義不同。unix-like是\n換行,windows則需\n\r)
上列指令意思是宣告main的主要入口是由這個類別進入的。如果需要接一個classpath,可以這樣定義:
Class-Path: ThirdPartyLibs.jar
接下來必須把這個主類別也包進去:
jar -cvmf manifest.mf TestNewjob.jar TestNewjob.class work1/ work2/
需注意引數的順序。倘若是mf,則表示要先宣告manifest.mf(名稱其實不重要),再宣告jar檔。當然你也可以相反過來,檔案名稱互換一下就可以了。並且包覆的主類別其.class也要補進去。
這樣就包成一個可以執行的jar檔了!如何執行呢?
java -jar TestNewjob.jar
就可以快樂執行了!

3. 實際佈署java應用程式
java可以接受直接使用第三方的類別庫,不過必須要放在特定的位置才能直接使用。存放類別庫的位置依據客戶端是使用private JRE還是public JRE而定。判定的方法很簡單:

java -server
如果有出現
Usage: gij [OPTION] ... CLASS [ARGS] ...
    to invoke CLASS.main, or
    gij -jar [OPTION] ... JARFILE [ARGS] ...
    to execute a jar file
Try `gij --help' for more information.
以上的訊息,表示你的java是使用private JRE;假設顯示的是錯誤訊息,表示客戶端使用的是public JRE,也就是只有安裝JRE而非JDK。
假設我們所使用的是private JRE,表示此JRE是由JDK所帶來的,因此應該放在$JDK/jre/lib/ext裡。
如果使用的是public JRE,表示使用的是JRE,因此應該放在$JRE/lib/ext裡。

不過第三方的類別庫可別放太多,否則編譯時間會大大的增加!

沒有留言: