Java Embedded(4)建立 Raspberry Pi 上的 Java 執行環境 by Michael | CodeData
top

Java Embedded(4)建立 Raspberry Pi 上的 Java 執行環境

分享:

Java Embedded(3)Raspberry Pi 硬體週邊與作業系統設定 << 前情

4-1 在Raspberry Pi安裝Java SE 8 JDK

在準備好Raspberry Pi的作業系統以後,你可以使用SSH連線到Raspberry Pi,使用下列的指令檢查JDK的版本,看看顯示的資訊是否都顯示JDK 8:

javac -version
java -version

確定Raspberry Pi已經安裝好JDK 8,可以先體驗一個JavaFX應用程式。如果你的Raspberry Pi還沒有連接滑鼠、鍵盤與螢幕,先執行下列的指令關機:

sudo poweroff

關閉電源以後,依照下列圖型的說明連接滑鼠、鍵盤與螢幕:

JavaEmbedded_04_01

開啟Raspberry Pi的電源,開機完成後,回到你的工作電腦,在GitHubhttps://github.com/macdidi5/JavaEmbedded提供的檔案,「examples4」目錄下有一個名稱為「FXThreadDemo.jar」的Java執行檔。你可以使用下列的指令在你的工作電腦執行這個程式:

java -jar FXThreadDemo.jar

在出現的視窗畫面左上角,可以調整顯示進度的ProgressIndicator的數量,選擇右上角的電源圖示可以結束應用程式:

JavaEmbedded_04_02

啟動一個新的命令提示字元視窗,使用pscp複製FXThreadDemo.jar檔案到Raspberry Pi:(要自己更換Raspberry Pi的IP位址)

pscp FXThreadDemo.jar pi@192.168.0.1:/home/pi/

檔案複製到Raspberry Pi以後,在使用SSH連線到Raspberry Pi的視窗,執行下列的指令檢查剛才傳輸的檔案:

ls -l FXThreadDemo.jar

如果確定檔案已經存在,使用下列的指令執行程式:

java -jar FXThreadDemo.jar

執行指令以後,將螢幕切換到Raspberry Pi的畫面,在Raspberry Pi執行程式要花一些時間,請耐心等候。等候出現應用程式的畫面,使用連接到Raspberry Pi的滑鼠操作看看,最後記得結束這個應用程式:

JavaEmbedded_04_03

如果你在工作的電腦與Raspberry Pi都執行過這個程式,而且都把ProgressIndicator的數量設定為最大(32個),應該可以發現在Raspberry Pi的執行效率會比較差一些。

4-2 建立與上傳Java Embedded JRE到Raspberry Pi

Java Embedded(2)安裝 Java Embedded 開發環境已經安裝好Java SE與Embedded 8 JDK,設定好需要的環境變數,而且已經測試過建立Embedded JRE的作法。為了後續的應用,先建立好compact1,compact2與compact3三種執行環境。在工作電腦啟動命令提示字元,執行下列的指令切換到Embedded JDK目錄:

cd %EJDK_HOME%

分別執行下列三個指令建立Java Embedded 8執行環境:

bin\jrecreate.bat --profile compact1 --dest myjre\mycompact1\
bin\jrecreate.bat --profile compact2 --dest myjre\mycompact2\
bin\jrecreate.bat --profile compact3 --dest myjre\mycompact3\

檢查%「EJDK_HOME%\myjre」目錄,應該有mycompact1、mycompact2與mycompact3三個目錄,分別儲存三個profile的執行環境。在工作電腦的命令提示字元視窗,執行下列的指令,把建立好的執行環境上傳到Raspberry Pi:

pscp -r %EJDK_HOME%\myjre pi@192.168.1.105:/home/pi/

登入Raspberry Pi後,輸入下列的指令,檢查上傳的檔案:

ls -l ~/myjre

total 12
drwxr-xr-x 4 pi pi 4096 Aug 21 14:23 mycompact1
drwxr-xr-x 4 pi pi 4096 Aug 21 14:23 mycompact2
drwxr-xr-x 4 pi pi 4096 Aug 21 14:24 mycompact3

上傳檔案到Raspberry Pi的執行環境檔案可能沒有執行的權限,所以在登入Raspberry Pi的視窗,執行下列的指令加入檔案執行的權限:

chmod +x -R ~/myjre

完成設定以後,執行下列的指令檢查Java的版本:

cd ~/myjre
./mycompact1/bin/java -version

你可以檢查「Java SE Embedded Runtime Environment」、「profile compact1」與「headless」的內容:

java version "1.8.0"
Java(TM) SE Embedded Runtime Environment (build 1.8.0-b132, profile compact1, headless)
Java HotSpot(TM) Embedded Minimal VM (build 25.0-b70, mixed mode)

執行下列的指令檢查compact2的執行環境:

./mycompact2/bin/java -version

檢查畫面顯示的內容:

java version "1.8.0"
Java(TM) SE Embedded Runtime Environment (build 1.8.0-b132, profile compact2, headless)
Java HotSpot(TM) Embedded Minimal VM (build 25.0-b70, mixed mode)

執行下列的指令檢查compact3的執行環境:

./mycompact3/bin/java -version

檢查畫面顯示的內容:

java version "1.8.0"
Java(TM) SE Embedded Runtime Environment (build 1.8.0-b132, profile compact3, headless)
Java HotSpot(TM) Embedded Client VM (build 25.0-b70, mixed mode)

上列使用「jrecreate」產生執行環境的作法,只有指定profile參數,其它都是採用預設的設定。jrecreate有下列主要的參數,可以依照應用程式的需求加入設定:

  • -d、–dest :設定執行環境儲存的位置。
  • -p、–profile :設定執行環境的compact profile,可以設定為compact1、compact2或compact3。如果沒有指定,預設為Full JRE。
  • –vm :設定執行環境使用的JVM,可以設定為:

    • minimal
    • client
    • server
    • all

    如果沒有指定,根據profile的設定,compact1與compact2使用minimal,compact3使用client;如果沒有設定profile,預設為包含所有JVM。

  • -x、–extension :設定JRE額外的元件。可以包含下列設定值:

    • fx:graphics:為headfull應用程式加入JavaFX圖型與基礎元件。
    • fx:controls:為headfull應用程式加入JavaFX控制項、圖型與基礎元件。設定這個選項也要同時加入fx:graphics的設定。
    • sunec:加入Elliptic Curve Cryptography(ECC)安全性元件。
    • sunpkcs11:加入Cryptographic Token Interface Standard(PKCS#11)安全性元件。
    • locales:加入所有Java SE的區域資訊。
    • charsets:加入額外的字元集。
    • nashorn:加入Nashorn JavaScript引擎。
  • -g、–debug :讓JRE支援除錯模式。JVM選擇minimal時不支援這個選項。

  • –ejdk-home :指定Java Embedded安裝位置。如果沒有指定,使用EJDK_HOME環境變數的設定。

如果你開發一個使用JavaFX的headfull應用程式,使用FXML設計應用程式畫面,提供一些控制項元件讓使用者操作,例如按鈕。你就可以使用下列的指令建立需要的執行環境:

%EJDK_HOME%\bin\jrecreate.bat \
--dest myjre\mycompact3hf \
--profile compact3 \
--extension fx:graphics \
--extension fx:controls

執行指令以後產生的訊息:

Building JRE using Options {
    ejdk-home: C:\JavaEmbedded\ejdk1.8.0
    dest: C:\JavaEmbedded\ejdk1.8.0_06\myjre\mycompact3hf
    target: linux_arm_vfp_hflt
    vm: client
    runtime: compact3 profile
    debug: false
    keep-debug-info: false
    no-compression: false
    dry-run: false
    verbose: false
    extension: [fx:graphics, fx:controls]
}


Target JRE Size is 30,315 KB (on disk usage may be greater).
Embedded JRE created successfully    

4-3 使用Java嵌入式環境執行應用程式

完成上傳Java Embedded JRE到Raspberry Pi的工作,現在就可以測試看看Java嵌入式的執行環境。建議你可以在Raspberry Pi執行下列幾個指令,建立一個儲存測試應用程式的目錄:

cd ~
mkdir mywork
cd mywork

在工作電腦建立一個Java應用程式:

import static java.lang.Thread.sleep;

public class TestThread {

    public static void main(String[] args) throws InterruptedException {
        runThread("Simon");
        Thread.sleep(1000 * 2);
        runThread("Mary");
        Thread.sleep(1000 * 2);
        runThread("John");
    }

    public static void runThread(String name) {
        int count = (int)(Math.random() * 80) + 20;

        Thread[] ts = new Thread[count];

        for (int c = 0; c < ts.length; c++) {
            ts[c] = new Thread() {
                public void run() {
                    System.out.println(getName() + ": start...");

                    for (int i = 0; i < 100; i++) {
                        try {
                            sleep((int)(Math.random() * 1000));
                        }
                        catch (InterruptedException e) {

                        }
                    }

                    System.out.println(getName() + ": end...");
                }
            };

            ts[c].setName(name + "(" + c + ")");

            ts[c].start();
        }
    }
}

儲存這個程式,使用下列的指令傳送到Raspberry Pi:

pscp TestThread.java pi@192.168.1.105:/home/pi/mywork

在使用SSH登入Raspberry Pi的視窗,確認上傳的檔案以後,編譯與執行這個程式:

javac TestThread.java
java TestThread

使用「java」指令執行應用程式,表示在預設的Java SE 8環境中執行,這個範例程式會啟動很多執行緒執行簡單的測試。你也可以使用已經上傳的Java Embedded JRE執行這個應用程式,執行下列的指令,使用compact1執行應用程式:

../myjre/mycompact1/bin/java TestThread

這個範例程式只有簡單的執行緒測試,可以在compact1的環境中正常運作。為了體驗不同profile之間的差異,試試Java在SE 7開始提供的Java Mission Control(JMC),它可以用來監控本機或遠端應用程式執行的狀態。要讓應用程式在執行的時候,提供JMC遠端監控的功能,必須在執行程式的時候加入一些的設定:

../myjre/mycompact1/bin/java \
-Dcom.sun.management.jmxremote.port=7091 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
TestThread

因為compact1與compact2不支援遠端監控的設定,執行上列的指令以後,會顯示下列的錯誤訊息:

-Dcom.sun.management is not supported in this VM.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

所以下列的指令把Embedded JRE換為compact3 profile,其餘的設定不變,就可以正確的執行應用程式了:

../myjre/mycompact3/bin/java \
-Dcom.sun.management.jmxremote.port=7091 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
TestThread  

4-4 使用Java Mission Control

Java從SE 7開始提供一個功能強大的整合工具「Java Mission Control」,可以用來監控Java應用程式的執行狀態。因為JMC跟遠端應用程式使用RMI通訊協定,所以要先檢查Raspberry Pi的相關設定,在使用SSH登入Raspberry Pi的視窗執行查詢IP位址的指令:

ifconfig

把Raspberry Pi的IP位址記起來以後,執行下列的指令修改設定:

sudo nano /etc/hosts

在出現的畫面中,把名稱為「raspberrypi」的IP位址改為剛才查詢的位址:

127.0.0.1   localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0     ip6-localnet
ff00::0     ip6-mcastprefix
ff02::1     ip6-allnodes
ff02::2     ip6-allrouters

192.168.1.105   raspberrypi

修改完成後,按下「Ctrl + X」、「y」和「Enter」鍵儲存檔案,最後執行重新啟動的指令:

sudo reboot

等到Raspberry Pi開機完成後,回到你的工作電腦,重新使用SSH登入Raspberry Pi。接下來準備啟動Java Mission Control,在工作電腦執行Java SE 8 JDK安裝目錄下的「bin\jmc.exe」,啟動成功以後可以看到一個像這樣的視窗:

JavaEmbedded_04_04

在JMC視窗左側的空間按滑鼠右鍵,選擇「New Connection」:

JavaEmbedded_04_05

在「New Connection」視窗,參考下列的資訊輸入需要的內容:

  • Host:Raspberry Pi的IP位址
  • Port:不用修改
  • User:pi
  • Password:你為pi使用者設定的密碼

JavaEmbedded_04_06

完成目前的設定以後,在使用SSH登入Raspberry Pi的視窗,使用下列的指令執行應用程式:

../myjre/mycompact3/bin/java \
-Dcom.sun.management.jmxremote.port=7091 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
TestThread  

程式開始運作以後,回到JMC New Connection視窗,選擇測試連線按鈕與完成連線設定:

JavaEmbedded_04_07

在JMC視窗左側新建立連線的目錄上按滑鼠右鍵,選擇「Start JMX Console」:

JavaEmbedded_04_08

JMC與Raspberry Pi上執行的應用程式連線成功以後,就可以看到像這樣的畫面,選擇「Thread」標籤頁:

JavaEmbedded_04_09

JMC切換到執行緒監控畫面,因為這個應用程式建立很多測試的執行緒,所以可以看到像這樣的畫面:

JavaEmbedded_04_10

等到在Raspberry Pi執行的應用程式結束以後,JMC會顯示離線的訊息。

課程相關的檔案都可以GitHub瀏覽與下載。

https://github.com/macdidi5/JavaEmbedded

後續 >> Java Embedded(5)開發環境、遠端執行環境的建立

分享:
按讚!加入 CodeData Facebook 粉絲群

相關文章

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

thomash11/08

老師您好,請問文中的Examples4是否已移除?GitHub中似乎未見此檔案可供下載練習??或是可在何處取得?煩請告知,謝謝~

江永慶04/29

老師不好意思,我執行FXThreadDemo.jar出現corrupt and invalid,爬文都說要用ellipse 輸出...

AntiAir11/07

老師您好,我使用JAVA SE8 在 Pi上執行 java -jar FXThreadDemo.jar 發生錯誤訊息: Error: Could not find or load main class fxthreaddemo.FXThreadDemo 請問是那裡設定錯誤, 因為我PATH應都有設定正確. 煩請解惑. 謝謝!

229117231405/07

老師您好,請問
pi@raspberrypi:~/java—gpio $ java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode)
pi@raspberrypi:~/java—gpio $ ls -l FXThreadDemo.jar
-rw-r--r-- 1 pi pi 74210 5月 7 01:42 FXThreadDemo.jar
pi@raspberrypi:~/java—gpio $ java -jar FXThreadDemo.jar
错误: 找不到或无法加载主类 fxthreaddemo.FXThreadDemo
請問是那裡設定錯誤啊,弄了好幾。就是不對呀

netsbig312/12

老師您好,我利用pscp複製HelloRaspberryPi.jar檔案到Raspberry Pi,可利用SSH連線到Raspberry Pi的視窗並成功執行該jar檔。
不過我利用相同的方法想要在Raspberry Pi上執行FXThreadDemo.jar及我自己利用JavaFX撰寫的一個簡單UI卻都失敗(路徑及指令再三確定都沒有錯誤),在開發電腦上是都可成功執行。想請問老師:是不是我在環境設定上有缺少哪些步驟,導致我在Raspberry Pi上無法執行含有UI的jar檔案?

熱門論壇文章

熱門技術文章