嘿,我好久沒寫Java的程式,聽說Raspberry Pi/Raspbian已預設安裝Java 8(套件名oracle-java8-jdk),來試試看吧。
首先是簡單的Hello World,程式碼如下:
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, world!");
}
}
儲存為檔名HelloWorld.java,然後進行編譯:
$ javac HelloWorld.java
得到HelloWorld.class,然後執行:
$ java HelloWorld
Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
Could not find the main class: HelloWorld. Program will exit.
嘿,怎麼會這樣呢?這麼簡單的程式碼也出錯?查詢javac與java的版本後,
$ javac -version
javac 1.8.0
$ java -version
java version "1.6.0_34"
OpenJDK Runtime Environment (IcedTea6 1.13.6) (6b34-1.13.6-1~deb7u1+rpi1)
OpenJDK Zero VM (build 23.25-b01, mixed mode)
發現兩者不同,所以問題應該是程式被編譯為1.8版,但執行環境(JRE、JVM)卻是1.6版,於是無法執行。嗯,怎麼辦呢?試著以參數指定版本吧:
$ javac -source 1.6 -target 1.6 HelloWorld.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6
1 warning
$ java HelloWorld
Hello, world!
哇,成功囉。
嗯,不過我想玩Java 8的新功能與新特色啊,拜過孤狗大神後,到Oracle JDK的網頁,下載JDK 8 for ARM,我下載的是jdk-8u33-linux-arm-vfp-hflt.tar.gz,放在家目錄裡,然後進行底下的步驟:
$ sudo mkdir -v -v /opt/java
$ sudo tar zxvf ~/jdk-8u33-linux-arm-vfp-hflt.tar.gz -C /opt/java
解壓縮並把所有東西放進/opt/java裡的子目錄jdk1.8.0_33,此時可刪除原先的壓縮檔。然後是告知系統我們想要使用剛剛安裝的Java版本。
$ sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk1.8.0_33/bin/java" 1
$ sudo update-alternatives --set java /opt/java/jdk1.8.0_33/bin/java
update-alternatives: using /opt/java/jdk1.8.0_33/bin/java to provide /usr/bin/java (java) in manual mode
查看版本,都是1.8囉。
$ javac -version
javac 1.8.0
$ java -version
java version "1.8.0_33"
Java(TM) SE Runtime Environment (build 1.8.0_33-b05)
Java HotSpot(TM) Client VM (build 25.33-b05, mixed mode)
另外,有些軟體需要環境變數JAVA_HOME,請編輯~/.bashrc,加入:
export JAVA_HOME="/opt/java/jdk1.8.0_33"
export PATH=$PATH:$JAVA_HOME/bin
耶,趕快來玩Java 8吧。
參考資料:
有 JDK8 的 javac,/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt 的 bin 中應該是有對應 java 才對,PATH 不對嗎?改一下應該就可以了,話說我這邊裝 Raspbian,就 javac 或 java 都是 8 的版本了。
ReplyDelete啊,原來如此,謝謝。應該是有些設定不正確。
Delete