2012年3月23日 星期五

在 ubuntu 11.10 上執行 .jar

假設 ubuntu 完全是剛灌好的狀態,會需要先安裝 JRE
然後把 eclipse 上的專案匯出成 jar 檔,設定 Manifest 以後再丟到 ubuntu 上執行。
以下就一步一步記錄我的執行流程!

安裝 JRE

因為目前我的網路環境不知道為什麼抓不到 sun-jdk,所以還是先用 ubuntu 原本的 openjdk
openjdk 6 的安裝方法:

sudo apt-get install openjdk-6-jdk

如果要安裝 sun jdk 的話,可以參考官方的文件
如果同時安裝 openjdk 跟 sun-jdk 的話,文件中也有指令可以選擇要用哪一個,可以依照需求選擇:

sudo update-alternatives --config java

安裝完 openjdk 以後,可以使用 which 指令來追蹤 java 的路徑在哪裡:

which java

例如我現在測試的虛擬機器的環境,會出現:
root@VirtualBox:~# which java
/usr/bin/java
root@VirtualBox:~# ls -al /usr/bin/java
lrwxrwxrwx 1 root root 22 2012-03-23 13:49 /usr/bin/java -> /etc/alternatives/java
root@VirtualBox:~# ls -al /etc/alternatives/java
lrwxrwxrwx 1 root root 40 2012-03-23 13:49 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java

另外也可以下 java -version 來獲得目前的 JRE 版本,我的環境是:
java version "1.6.0_23"
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2)
OpenJDK Client VM (build 20.0-b11, mixed mode, sharing)

要執行 Java SE 的程式時,我是在 Windows 上用 eclipse 開發
所以要從 eclipse 上匯出(export)專案變成一個 .jar 檔,然後放進 ubuntu 裡面~
匯出 .jar 檔的方法可參考:利用Eclipse製作可執行jar run
其中因為我的專案有使用到第三方的 API,所以必須在 Manifest.mf 檔中加上 Class-Path 參數
例如我需要的 .jar 檔有 a.jar、b.jar 和 c.jar
則 Manifest.mf 中要寫:

Class-Path: lib/a.jar lib/b.jar lib/c.jar

lib/ 這個路徑是可以任意決定的,決定的基準在於要執行的 .jar 檔與其他第三方 API 的相對路徑為何
以我設定的這個 Manifest,假設我的專案執行檔放在 /home/java 裡
則第三方 API 就必須放在 /home/java/lib 資料夾內。
匯出完成後,就把 .jar 丟到 /home/java 資料夾內,然後把第三方 API 丟到 /home/java/lib 裡
接著執行 java -jar 來執行專案的 jar 檔,例如
java -jar project.jar
如果前面沒有設定 Class-Path 的話,也可以在執行時下 java -cp <path1>:<path2>:.... 來指定路徑
不過好像有使用 -jar 來指定執行的 jar 檔時,CLASSPATH 參數會被直接忽略~?

2012-12-27 補充:
如果在要安裝 Sun Java 時,執行 add-apt-repository 卻出現找不到指令的問題
可以試試 [4] 的方法,執行以下指令安裝相關的指令。
sudo apt-get install python-software-properties

參考資料:
1、Need Help on JAVA_HOME, CLASSPATH set up
2、請問 java.lang.NoClassDefFoundError 的問題
3、官方文件中有關 Manifest 的描述
4、sudo: add-apt-repository: command not found???

沒有留言: