Java Embedded(2)安裝 Java Embedded 開發環境
|
Java Embedded(1)從 Raspberry Pi 開始 << 前情 2-1 認識嵌入式系統嵌入式系統同樣是在一般的電腦裝置上運作,不過跟我們使用的個人電腦與伺服器不太一樣。嵌入式系統的應用非常靈活、而且多樣化,你可以把嵌入式系統看成是一種「在看不到電腦的裝置中運作的系統應用程式」。嵌入式系統的裝置不像一般用途的電腦,它大部份都是為了特定的目的而製作,根據系統的應用,可能不需要滑鼠、鍵盤與螢幕,例如印表機。或是搭配觸控螢幕與感應設備,讓使用者執行特定的操作,例如旅遊服務中心的導覽機器。 大部份的嵌入式系統屬於「headless」,也就是不需要個人電腦一般的輸入設備,例如滑鼠與鍵盤,也不需要在螢幕上顯示文字或圖型的畫面。這樣的系統可能只需要一些感應設備,例如紅外線、溫度、人體感應或NFC。系統在接收到感應設備的資訊以後,應用程式負責執行後續的工作,例如在停車場偵測到車輛要出門的時候,讓警示燈開始運作並開啟電動門,而且也可以透過網路把訊息與資料傳送給伺服器,例如把出場車輛的照片與日期、時間,經由網路傳送給伺服器儲存在資料庫。 如果需要的話,嵌入式系統也可以是「headful」。各種硬體設備成本越來越低,例如大尺寸的觸控螢幕,嵌入式系統可以使用圖形使用者介面,讓使用者執行需要的操作,不過這些操作會限制在系統提供的特定功能,例如搭配讀卡機與觸控螢幕的自助照片沖洗裝置。 為了更清楚的分辨嵌入式與一般應用程式的差異,嵌入式系統主要有這些特性:
2-2 Java Embedded 8現身Java SE 8在2014年3月發佈以後,針對Java程式語言加入許多重大的變化,這也是大家比較關注的重點。不過在嵌入式應用程式的領域,Java技術也把這個部份的產品線補齊了,從Java Card、Java ME Embedded到Java SE Embedded,讓大部份嵌入式的實務應用,都可以找到最適合的運作環境。 Java SE Embedded 8有兩個最大的特色:
所以Java SE Embedded JDK不像Java SE JDK是一個固定的執行環境,你必須使用jrecreate建立需要的執行時期環境(JRE)與虛擬機器(JVM),這樣才能符合「夠用就好」的嵌入式系統設計概念。 嵌入式系統在硬體設備的架構與設計,通常會比較明確一些,根據系統特定的用途,決定需要的硬體設備。如果決定使用Java Embedded開發應用程式,你必需先決定該使用哪一種產品:
Java SE Embedded 8最重要的概念,就是你可以建立應用程式需要的Java Runtime Environment(JRE),包含適合的Java Virtual Mathine(JVM)和需要的類別庫。建立JRE的工具程式「jrecreate」,包含在Java SE Embedded 8 JDK。 2-3 訂製Java SE Embedded 8 JREJava SE Embedded 8 SDK提供可以讓你訂製JRE的工具程式,它可以產生比一般Java SE JRE小很多的執行環境,在嵌入式系統有限的資源環境下,可以讓應用程式的運作效率更好,也可以節省一些硬體設備的成本。 「jrecreate」工具程式可以根據應用程式的需求,組合適合的JVM和需要的類別庫,打造一個專屬的JRE: 除了讓應用程式使用的類別庫,jrecreate工具程式在建立JRE的時候,也可以指定執行環境使用的JVM,選擇正確的JVM對應用程式的效率非常重要,Java嵌入式系統有下列三種選擇:
Java SE API包含所有Java技術基礎與完整的類別庫,Java embedded應用程式的執行環境,只需要包含應用程式使用的API就可以了,稱為「Compact Profiles」,三種主要的compact profiles可以在API文件查詢詳細的內容: Java SE EMbedded 8包含下列三種Profiles與完整的API:
Java SE Embedded 8應用程式,也可以使用JavaFX建立需要的使用者介面。目前不支援下列的JavaFX套件:
2-4 檢測應用程式的compact profileJava嵌入式應用程式最重要的精神,就是讓應用程式在「剛好夠用」的執行環境下運作。Java SE 8 JDK提供全新的「jdeps」工具程式,可以檢測應用程式使用的API,然後為你判斷應用程式需要使用哪一種compact profiles。 在執行後續的工作之前,先確定你的電腦是否已經安裝好Java SE 8 JDK,如果還沒有安裝的話,在這裡https://www.oracle.com/technetwork/java/javase/downloads/index.html下載與安裝。完成安裝Java SE 8 JDK的工作後,開啟設定環境變數的視窗,選擇「新增」按鈕: 在新增系統環境變數的視窗,變數名稱輸入「JAVAHOME」,變數值輸入Java SE 8 JDK安裝的目錄,例如「C:\Program Files\Java\jdk1.8.011」(JDK安裝資料夾可能不一樣): 為了讓後續的操作可以簡單一些,修改系統環境變數「Path」的設定,在最前面加入「%JAVA_HOME%\bin;」: 完成環境變數設定後,選擇「確定」按鈕,儲存所有的設定。啟動新的命令提示字元視窗,輸入檢查Java版本的指令: javac -version java -version 確定上面兩個指令執行以後,顯示的資訊都是Java SE 8的版本。接下來先看看這個Java程式碼: public class HelloEmbedded {
public static void main(String[] args) {
System.out.println("Hello! Embedded!");
}
}
把這個程式碼儲存起來,使用下列的指令編譯程式碼: javac HelloEmbedded.java 編譯成功並產生類別檔後,執行下列的「jdeps」指令: jdeps -P HelloEmbedded.class 如果環境的設定沒有問題,jdeps工具程式會產生這樣的內容: HelloEmbedded.class -> (省略...)rt.jar (compact1)
<unnamed> (HelloEmbedded.class)
-> java.io compact1
-> java.lang compact1
jdeps工具程式在第一行最後的部份,顯示這個應用程式可以使用「compact1」profiles,後面也會列出所有用到的API套件名稱與所屬的profiles。再看看這個用到RMI API的程式碼: import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class HelloRMI {
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.getRegistry("helloRMI");
System.out.println("Hello RMI!");
}
catch (Exception e) {
System.err.println("RMI exception:");
e.printStackTrace();
}
}
}
儲存程式碼以後,使用下列的指令編譯程式碼: javac HelloRMI.java 編譯成功並產生類別檔後,執行「jdeps」指令: jdeps -P HelloRMI.class
HelloRMI.class -> (省略...)rt.jar (compact2)
<unnamed> (HelloRMI.class)
-> java.io compact1
-> java.lang compact1
-> java.rmi.registry compact2
這個範例程式使用「java.rmi.registry」API,所以應用程式必須在compact 2 profiles環境下才可以正確的運作。接下來看看這個使用外部類別庫的範例程式: import java.util.ArrayList;
import java.util.List;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
@Root
public class DataCollection<E> {
@ElementList(inline=true, required=false)
private List<E> list = new ArrayList<E>();
public void add(E item) {
list.add(item);
}
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
}
}
儲存程式碼以後,使用下列的指令編譯程式碼: javac -cp simple-xml-2.7.1.jar DataCollection.java 編譯成功並產生類別檔後,執行「jdeps」指令: jdeps -cp simple-xml-2.7.1.jar -P DataCollection.class
DataCollection.class -> (省略...)rt.jar (compact1)
DataCollection.class -> not found
<unnamed> (DataCollection.class)
-> java.lang compact1
-> java.util compact1
-> org.simpleframework.xml simple-xml-2.7.1.jar
判斷的結果是這個應用程式可以在compact 1 profiles環境下運作。你也可以檢測類別庫裡面的內容,執行下列的「jdeps」指令: jdeps -P simple-xml-2.7.1.jar simple-xml-2.7.1.jar -> (省略...)rt.jar (compact2) 省略... 因為這個類別庫使用「javax.xml」套件的API,所以檢測的結果是compact 2 profile。之前在檢測DataCollection類別的時候,結果卻是compact 1 profile,那是因為在DataCollection類別,並沒有使用到類別庫裡面屬於compact 2 profile的部份。 2-5 建立應用程式的Java SE Embedded JRE使用jdeps檢測應用程式的compact profile以後,就可以使用Java Embedded 8 JDK提供的「jrecreate」工具程式,建立應用程式的執行環境。Raspberry Pi採用ARM中央處理器,屬於ARMv6的架構,Raspbian Wheezy作業系統採用效率比較好的Hard float ABI,使用硬體處理浮點運算。依照下列的步驟下載、安裝與設定Java SE Embedded 8:
如果應用程式需要compact1 profile的執行環境,在Windows作業系統,要使用管理員權限開啟一個新的命令提示字元視窗(按滑鼠右鍵,選擇「以系統管理員身分執行」),執行下列的指令建立需要的JRE: cd %EJDK_HOME% bin\jrecreate.bat --profile compact1 --dest myjre\mycompact1\ 「–profile」指定產生的JRE是哪一種profile;「–dest」指定JRE儲存的位置。執行以後會顯示建立JRE的詳細資訊: Building JRE using Options {
ejdk-home: C:\JavaEmbedded\ejdk1.8.0_06
dest: C:\JavaEmbedded\ejdk1.8.0_06\myjre\mycompact1
target: linux_arm_vfp_hflt
vm: minimal
runtime: compact1 profile
debug: false
keep-debug-info: false
no-compression: false
dry-run: false
verbose: false
extension: []
執行上面的指令後,產生的JRE儲存在「myjre\mycompact1」目錄下,後面討論的主題,會說明如何把JRE上傳到Raspberry Pi的作法。使用同樣的方式,也可以產生compact2 profile的JRE: cd %EJDK_HOME%
bin\jrecreate.bat --profile compact2 --dest myjre\mycompact2\
Building JRE using Options {
ejdk-home: C:\JavaEmbedded\ejdk1.8.0_06
dest: C:\JavaEmbedded\ejdk1.8.0_06\myjre\mycompact2
target: linux_arm_vfp_hflt
vm: minimal
runtime: compact2 profile
debug: false
keep-debug-info: false
no-compression: false
dry-run: false
verbose: false
extension: []
}
現在已經初步瞭解Java SE Embedded 8的概念與運作的方式,後續的內容在建立與設定好Raspberry Pi以後,就可以開始執行與測試Java嵌入式應用程式。 課程相關的檔案都可以GitHub瀏覽與下載。 |

Java 學習之路





https://github.com/macdidi5/JavaEmbedded




netsbig3
11/30老師您好
我在「使用「java.rmi.registry」API」的範例中
不過出現了「package org simpleframework xml does not exist」的錯誤訊息
網路上也找不到相關的資料
請問這個錯誤該如何來修正?
儲存並編譯DataCollection.java的程式碼