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,如果還沒有安裝的話,在這裡http://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瀏覽與下載。 |
netsbig3
11/30
老師您好
我在「使用「java.rmi.registry」API」的範例中
不過出現了「package org simpleframework xml does not exist」的錯誤訊息
網路上也找不到相關的資料
請問這個錯誤該如何來修正?
儲存並編譯DataCollection.java的程式碼