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 關閉電源以後,依照下列圖型的說明連接滑鼠、鍵盤與螢幕: 開啟Raspberry Pi的電源,開機完成後,回到你的工作電腦,在GitHubhttp://github.com/macdidi5/JavaEmbedded提供的檔案,「examples4」目錄下有一個名稱為「FXThreadDemo.jar」的Java執行檔。你可以使用下列的指令在你的工作電腦執行這個程式: java -jar FXThreadDemo.jar 在出現的視窗畫面左上角,可以調整顯示進度的ProgressIndicator的數量,選擇右上角的電源圖示可以結束應用程式: 啟動一個新的命令提示字元視窗,使用pscp複製FXThreadDemo.jar檔案到Raspberry Pi:(要自己更換Raspberry Pi的IP位址) pscp FXThreadDemo.jar [email protected]:/home/pi/ 檔案複製到Raspberry Pi以後,在使用SSH連線到Raspberry Pi的視窗,執行下列的指令檢查剛才傳輸的檔案: ls -l FXThreadDemo.jar 如果確定檔案已經存在,使用下列的指令執行程式: java -jar FXThreadDemo.jar 執行指令以後,將螢幕切換到Raspberry Pi的畫面,在Raspberry Pi執行程式要花一些時間,請耐心等候。等候出現應用程式的畫面,使用連接到Raspberry Pi的滑鼠操作看看,最後記得結束這個應用程式: 如果你在工作的電腦與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 [email protected]:/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有下列主要的參數,可以依照應用程式的需求加入設定:
如果你開發一個使用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 [email protected]:/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 ControlJava從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」,啟動成功以後可以看到一個像這樣的視窗: 在JMC視窗左側的空間按滑鼠右鍵,選擇「New Connection」: 在「New Connection」視窗,參考下列的資訊輸入需要的內容:
完成目前的設定以後,在使用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視窗,選擇測試連線按鈕與完成連線設定: 在JMC視窗左側新建立連線的目錄上按滑鼠右鍵,選擇「Start JMX Console」: JMC與Raspberry Pi上執行的應用程式連線成功以後,就可以看到像這樣的畫面,選擇「Thread」標籤頁: JMC切換到執行緒監控畫面,因為這個應用程式建立很多測試的執行緒,所以可以看到像這樣的畫面: 等到在Raspberry Pi執行的應用程式結束以後,JMC會顯示離線的訊息。 課程相關的檔案都可以GitHub瀏覽與下載。 |
thomash
11/08
老師您好,請問文中的Examples4是否已移除?GitHub中似乎未見此檔案可供下載練習??或是可在何處取得?煩請告知,謝謝~
江永慶
04/29
老師不好意思,我執行FXThreadDemo.jar出現corrupt and invalid,爬文都說要用ellipse 輸出...
AntiAir
11/07
老師您好,我使用JAVA SE8 在 Pi上執行 java -jar FXThreadDemo.jar 發生錯誤訊息: Error: Could not find or load main class fxthreaddemo.FXThreadDemo 請問是那裡設定錯誤, 因為我PATH應都有設定正確. 煩請解惑. 謝謝!
2291172314
05/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
請問是那裡設定錯誤啊,弄了好幾。就是不對呀
netsbig3
12/12
老師您好,我利用pscp複製HelloRaspberryPi.jar檔案到Raspberry Pi,可利用SSH連線到Raspberry Pi的視窗並成功執行該jar檔。
不過我利用相同的方法想要在Raspberry Pi上執行FXThreadDemo.jar及我自己利用JavaFX撰寫的一個簡單UI卻都失敗(路徑及指令再三確定都沒有錯誤),在開發電腦上是都可成功執行。想請問老師:是不是我在環境設定上有缺少哪些步驟,導致我在Raspberry Pi上無法執行含有UI的jar檔案?