Java Embedded(2)安裝 Java Embedded 開發環境 by Michael | CodeData
top

Java Embedded(2)安裝 Java Embedded 開發環境

分享:

Java Embedded(1)從 Raspberry Pi 開始 << 前情

2-1 認識嵌入式系統

嵌入式系統同樣是在一般的電腦裝置上運作,不過跟我們使用的個人電腦與伺服器不太一樣。嵌入式系統的應用非常靈活、而且多樣化,你可以把嵌入式系統看成是一種「在看不到電腦的裝置中運作的系統應用程式」。嵌入式系統的裝置不像一般用途的電腦,它大部份都是為了特定的目的而製作,根據系統的應用,可能不需要滑鼠、鍵盤與螢幕,例如印表機。或是搭配觸控螢幕與感應設備,讓使用者執行特定的操作,例如旅遊服務中心的導覽機器。

大部份的嵌入式系統屬於「headless」,也就是不需要個人電腦一般的輸入設備,例如滑鼠與鍵盤,也不需要在螢幕上顯示文字或圖型的畫面。這樣的系統可能只需要一些感應設備,例如紅外線、溫度、人體感應或NFC。系統在接收到感應設備的資訊以後,應用程式負責執行後續的工作,例如在停車場偵測到車輛要出門的時候,讓警示燈開始運作並開啟電動門,而且也可以透過網路把訊息與資料傳送給伺服器,例如把出場車輛的照片與日期、時間,經由網路傳送給伺服器儲存在資料庫。

如果需要的話,嵌入式系統也可以是「headful」。各種硬體設備成本越來越低,例如大尺寸的觸控螢幕,嵌入式系統可以使用圖形使用者介面,讓使用者執行需要的操作,不過這些操作會限制在系統提供的特定功能,例如搭配讀卡機與觸控螢幕的自助照片沖洗裝置。

為了更清楚的分辨嵌入式與一般應用程式的差異,嵌入式系統主要有這些特性:

  • 嵌入式系統的裝置通常是為了特定用途製造的,提供的功能是比較固定的,在完成後也比較不會變更硬體與系統的設計。
  • 根據系統的需求搭配需要的硬體設備,例如感應器與讀卡機;也可以控制外部的機械裝置,例如電動門。
  • 為了節省系統的成本,硬體設備會根據系統需求,以符合應用程式運作的標準來設計,例如CPU、記憶體與儲存設備。
  • 開發人員必須特別注意應用程式的設計架構與使用的資源。

2-2 Java Embedded 8現身

Java SE 8在2014年3月發佈以後,針對Java程式語言加入許多重大的變化,這也是大家比較關注的重點。不過在嵌入式應用程式的領域,Java技術也把這個部份的產品線補齊了,從Java Card、Java ME Embedded到Java SE Embedded,讓大部份嵌入式的實務應用,都可以找到最適合的運作環境。

Java SE Embedded 8有兩個最大的特色:

  • Compact Profiles :Java SE Embedded 8包含三種已經設定好的compact profiles,有compact1、compact2與compact3,它們都是完整API的子集合,你可以根據應用程式需要的類別庫,選擇一個符合的JRE。
  • Java SE Embedded JDK :包含「jrecreate」的工具程式,開發人員可以使用它建立符合裝置與應用程式需求的JRE;還有包含在Java SE JDK裡面的「jdeps」工具程式,它可以檢查你的應用程式用的類別庫,用來決定要使用哪一種compact profiles。

所以Java SE Embedded JDK不像Java SE JDK是一個固定的執行環境,你必須使用jrecreate建立需要的執行時期環境(JRE)與虛擬機器(JVM),這樣才能符合「夠用就好」的嵌入式系統設計概念。

嵌入式系統在硬體設備的架構與設計,通常會比較明確一些,根據系統特定的用途,決定需要的硬體設備。如果決定使用Java Embedded開發應用程式,你必需先決定該使用哪一種產品:

  • Oracle Java SE 8 :應用程式需要完整的API支援,或是因為硬體架構的限制。
  • Oracle Java SE Embedded 8:應用程式運作的時候,應用程式與JRE需要10MB的記憶體,根據系統的需求,如果需要使用者圖型介面,可以選擇「headfull」,如果不需要的話就選擇「headless」。
  • Oracle Java ME Embedded 8 :應用程式運作的時候,應用程式與JRE需要1MB或1MB以下的記憶體,而且不需要使用者圖型介面(headless)。

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 JRE

Java SE Embedded 8 SDK提供可以讓你訂製JRE的工具程式,它可以產生比一般Java SE JRE小很多的執行環境,在嵌入式系統有限的資源環境下,可以讓應用程式的運作效率更好,也可以節省一些硬體設備的成本。

「jrecreate」工具程式可以根據應用程式的需求,組合適合的JVM和需要的類別庫,打造一個專屬的JRE:

JavaEmbedded_02_01

除了讓應用程式使用的類別庫,jrecreate工具程式在建立JRE的時候,也可以指定執行環境使用的JVM,選擇正確的JVM對應用程式的效率非常重要,Java嵌入式系統有下列三種選擇:

  • Minimal JVM :使用最少資源的JVM,例如使用single serial garbage collector負責記憶體回收。適合執行工作頻率較低的嵌入式應用程式。
  • Client JVM :包含完整的JVM特性而且反應的效率比較好,支援garbage collector的監控與記錄。適合非長期運作、反應需求較快的嵌入式應用程式。
  • Server JVM :包含完整的JVM特性,適合長時間運作的嵌入式應用程式,使用最多的資源,啟動應用程式也需要多花一些時間。

Java SE API包含所有Java技術基礎與完整的類別庫,Java embedded應用程式的執行環境,只需要包含應用程式使用的API就可以了,稱為「Compact Profiles」,三種主要的compact profiles可以在API文件查詢詳細的內容:

JavaEmbedded_02_02

Java SE EMbedded 8包含下列三種Profiles與完整的API:

  • compact1 Profiles APIs :跟早期傳統的Connected Device Configuration(CDC)類似,包含Foundation Profile、secure sockets layer(SSL)、logging與支援Javascript語言。搭配minimal JVM大約需要12MB的空間。
  • compact2 Profiles APIs :搭配minimal JVM大約需要17MB的空間。比compact1多了下列三個套件:
    • Remote Method Invocation(RMI)
    • Java API for XML Processing(JAXP)
    • Java Database Connectivity(JDBC)
  • compact3 Profiles APIs :比compact2多了serviceability、naming與compiler API。compact3不可以搭配minimal JVM。
  • Full JRE APIs :比compact3多了web services與CORBA APIs,只有Full JRE支援Java Flight Recorder。搭配client JVM大約需要50MB的空間。

Java SE Embedded 8應用程式,也可以使用JavaFX建立需要的使用者介面。目前不支援下列的JavaFX套件:

  • javafx.beans.property.adapter:整合JavaBeans
  • javafx.embed.swing:整合Swing API
  • javafx.embed.swt:整合SWT API
  • javafx.print:列印API
  • javafx.scene.media:多媒體播放
  • javafx.scene.web:網頁內容
  • netscape.javascript:JavaScript整合

2-4 檢測應用程式的compact profile

Java嵌入式應用程式最重要的精神,就是讓應用程式在「剛好夠用」的執行環境下運作。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的工作後,開啟設定環境變數的視窗,選擇「新增」按鈕:

JavaEmbedded_02_03

在新增系統環境變數的視窗,變數名稱輸入「JAVAHOME」,變數值輸入Java SE 8 JDK安裝的目錄,例如「C:\Program Files\Java\jdk1.8.011」(JDK安裝資料夾可能不一樣):

JavaEmbedded_02_04

為了讓後續的操作可以簡單一些,修改系統環境變數「Path」的設定,在最前面加入「%JAVA_HOME%\bin;」:

JavaEmbedded_02_05

完成環境變數設定後,選擇「確定」按鈕,儲存所有的設定。啟動新的命令提示字元視窗,輸入檢查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:

  1. 在瀏覽器開啟這個網址:http://www.oracle.com/technetwork/java/embedded/embedded-se/downloads/index.html
  2. 選擇「Accept License Agreement」同意接受版權聲明,選擇「ARMv6/ARMv7 Linux – VFP, HardFP ABI, Little Endian1」的下載連結並儲存下載的檔案:

    JavaEmbedded_02_06

  3. 在這個網站http://www.7-zip.org/下載與安裝7-Zip解壓縮軟體。
  4. 在檔案名稱按滑鼠右鍵,選擇「7-Zip -> 解壓縮至此」,完成後會產生一個沒有附加檔名的檔案「ejdk-8u33-fcs-linux-armv6-vfp-hflt」(檔案名稱可能不一樣)。
  5. 在解壓縮後的檔案名稱按滑鼠右鍵,選擇「7-Zip -> 解壓縮檔案」,在解壓縮視窗的「解壓縮至」欄位輸入「C:\」,然後選擇「確定」按鈕。
  6. 開啟設定環境變數的視窗,選擇「新增」按鈕,在新增系統環境變數的視窗,變數名稱輸入「EJDKHOME」,變數值輸Java Embedded 8 JDK解壓縮的目錄,例如「C:\ejdk1.8.033」。

如果應用程式需要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瀏覽與下載。

https://github.com/macdidi5/JavaEmbedded

後續 >> Java Embedded (3)Raspberry Pi 硬體週邊與作業系統設定

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

留言

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

netsbig311/30

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

關於作者

張益裕。目前的工作是講師與作者,專長是教育訓練課程規劃、教材編製與課程推廣,技術書籍與專欄寫作。涵蓋的領域有OOAD、Java程式設計、JavaFX、Java Embedded、Android與SQL。已出版電子書Google Play圖書Pubu

熱門論壇文章

熱門技術文章