2017年4月28日 星期五

java 編譯/執行環境 (2) - 建立 java jar 執行檔

執行一個 java 程式看來有點麻煩, 要知道所有的 class path, 哪些 class 在哪裡, 很麻煩, 有沒有類似像 c/c++ 這樣編譯出一個執行檔就可以呢?

jar 出現了, 它其中之一的功能就是打包需要的 class, 製作出一個獨立的執行檔。

以下都在這個目錄操作這些指令。
descent@debian64:java$ pwd
/home/descent/git/progs/java

編寫 manifest.txt
1 Main-Class: DescentPackage.HelloWorld

manifest.txt 有很多參數, jar 執行檔需要 Main-Class 這個參數, 填上它吧。

當然要先把 *.class 透過 javac 編譯出來。
descent@debian64:java$ ls DescentPackage/*.class
DescentPackage/HelloWorld.class  DescentPackage/PrintString.class

# 產生 jar 執行檔
jar -cvmf manifest.txt h.jar  DescentPackage/*.class

# 執行這個 jar 執行檔
descent@debian64:java$ java -jar ./h.jar 
yy Hello World
XX Hello World

在 linux 下直接執行這個 jar 執行檔。

apt-get install binfmt-support
escent@debian64:java$ chmod 755 h.jar 
descent@debian64:java$ ./h.jar 
yy Hello World
XX Hello World

在 windows 執行這個 jar 也是沒問題的 (fig 1)。

fig 1. 在 windows 7 執行在 linux 編譯的 jar 執行檔

如果你不信邪, 想試試在 DescentPackage 目錄產生 jar 執行檔, 會發現可以建立 hh.jar, 卻怎麼都無法執行。
descent@debian64:DescentPackage$ pwd
/media/work/git/progs/java/DescentPackage
descent@debian64:DescentPackage$ jar -cvmf manifest.txt hh.jar  *.class 
added manifest
adding: HelloWorld.class(in = 516) (out= 341)(deflated 33%)
adding: PrintString.class(in = 419) (out= 292)(deflated 30%)

descent@debian64:DescentPackage$ java -jar ./hh.jar 
Error: Could not find or load main class DescentPackage.HelloWorld
descent@debian64:DescentPackage$ java -cp .. -jar ./hh.jar 
Error: Could not find or load main class DescentPackage.HelloWorld

先這樣, 我不想在搞這個了, 有夠煩。

ref:
How to run a jar file in a linux commandline

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。