2015/05/13

Raspberry Pi與Java 8:Hello World

嘿,我好久沒寫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吧。


參考資料:

2 comments:

  1. 有 JDK8 的 javac,/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt 的 bin 中應該是有對應 java 才對,PATH 不對嗎?改一下應該就可以了,話說我這邊裝 Raspbian,就 javac 或 java 都是 8 的版本了。

    ReplyDelete
    Replies
    1. 啊,原來如此,謝謝。應該是有些設定不正確。

      Delete