Java EE 用戶端應用程式類別載入

當您執行 Java™ Platform, Enterprise Edition (Java EE) 應用程式用戶端時,會建立類別載入器階層,以載入應用程式所使用的類別。

下列清單說明類別載入器的階層:
  • Application Client for WebSphere® Application Server (應用程式用戶端) 執行時期會將此值設為 WAS_LOGGING 環境變數。
  • [AIX Solaris HP-UX Linux Windows] extensions class loader 是引導類別載入器的子項。 這個類別載入器包含 java/jre/lib/ext 目錄中的 JAR 檔,或 Java 指令上 -Djava.ext.dirs 參數所定義的 JAR 檔。 應用程式用戶端用戶端執行時期未設定 -Djava.ext.dirs 參數。 因此,它會使用 java/jre/lib/ext 目錄中的 JAR 檔。
  • [IBM i]延伸類別載入器是引導類別載入器的子項。 這個類別載入器包含 app_server_root /java/ext 目錄、java_home/lib/ext 或 java_home/jre/lib/ext 目錄,以及 /QIBM/UserData/Java400/ext 目錄中的 JAR 檔。 app_server_root 目錄是產品安裝路徑。 java_home 目錄是 Java 檔的安裝路徑。
    [IBM i]注意: java_home 參數可以是三個值中的任何一個值,視啟用的 Java 虛擬機器 (JVM) 而定。 三個可能的值如下:
    • /QOpenSys/QIBM/ProdData/JavaVM/jdk60/32bit (Java SE 6 32 位元)
    • /QOpenSys/QIBM/ProdData/JavaVM/jdk60/64bit (Java SE 6 64 位元)
  • 系統類別載入器包含 Java 指令上 -classpath 參數所定義的 JAR 檔和類別。 應用程式用戶端執行時期會將這個參數設為 WAS_CLASSPATH 環境變數。
  • WebSphere 類別載入器會載入應用程式用戶端執行時期,以及位於應用程式用戶端使用者目錄中的任何類別。 這個類別載入器所用的目錄是由 WAS_EXT_DIRS 環境變數來定義。 WAS_BOOTCLASSPATHWAS_CLASSPATH、 及 WAS_EXT_DIRS 環境變數設定在 WebSphere Application Server 安裝架構的 app_server_root/bin/setupCmdLine Script 中, 或在用於用戶端安裝的 app_server_root/bin/setupClient Script 中。

當 Java EE 應用程式用戶端執行時期起始設定時,會建立其他類別載入器作為 WebSphere 類別載入器的子項。 如果您的用戶端應用程式使用諸如 Java DataBase 連線功能 (JDBC) 之類的資源 API、Java 訊息服務 (JMS) API 或「統一資源定址器 (URL)」會建立不同的類別載入器來載入其中每一個資源。 最後,應用程式用戶端執行時期會反覆地處理用戶端 JAR 資訊清單,將 WebSphere 類別載入器設為載入 EAR 檔內的類別。 永不使用 CLASSPATH 環境變數所定義的系統類別路徑,它不是類別載入器階層的一部分。

如果要正確包裝用戶端應用程式,您必須瞭解哪些類別載入器會載入您的類別。 當 Java 程式碼載入類別時,會將用來載入該類別的類別載入器指派給它。 後續由該類別載入的任何類別都會使用該類別載入器或其任何母項,但不會使用子類別載入器。

在某些情況下,「應用程式用戶端」執行時期可以偵測到用戶端應用程式類別是由不同於「應用程式用戶端」執行時期為它所建立的類別載入器來載入。 當發生此偵測時,您會看到下列訊息:
WSCL0205W: The incorrect class loader was used to load [0]
當階層中的其中一個母類別載入器載入用戶端應用程式類別時,會出現此訊息。 此狀況通常是由於在 EAR 檔及硬碟上具有相同的類別所導致。 如果其中一個母類別載入器找到類別,該類別載入器會在應用程式用戶端執行時期類別載入器之前載入它。 在某些情況下,您的用戶端應用程式仍可正常運作。 不過,在大部分情況下,您會收到 找不到類別 異常狀況。

配置類別路徑欄位

包裝 Java EE 用戶端應用程式時,您必須配置各種類別路徑欄位。 理論上,您應該將應用程式所需的一切包裝成 EAR 檔。 這是將 Java EE 用戶端應用程式配送至用戶端最簡單的方法。 不過,您不應該包裝 JDBC API、JMS API 或 URL 之類的資源。 如果是這些資源,請使用類別路徑參照來存取硬碟上的那些類別。 您也可能在用戶端機器上安裝了不需要重新配送的其他類別。 在此情況下,您也想要使用類別路徑參照來存取硬碟上的類別,如本主題稍後的說明。

參照 EAR 檔內的類別

WebSphere 產品 Java EE 應用程式不使用系統類別路徑。 使用 MANIFEST 類別路徑項目來參照 EAR 檔內的其他 JAR 檔。 請使用組合工具來配置這些值。 比方說,如果您的用戶端應用程式需要存取 EJB JAR 檔的路徑,請將已部署的 Enterprise Bean 模組名稱新增至應用程式用戶端類別路徑。 每一個不同模組 (應用程式用戶端、EJB、Web) 的「類別路徑」欄位格式相同:
  • 這些值必須參照 EAR 檔內包含的 JAR 和類別檔。
  • 這些值必須相對於 EAR 檔的根目錄。
  • 這些值無法參照檔案系統中的絕對路徑。
  • 多個值必須以空格而非冒號或分號區隔。
注意: 這是 Java 方法,可讓應用程式獨立於平台運作。

通常,您會將模組 (JAR 檔) 新增至 EAR 檔的根目錄。 在此情況下,您只需要在「類別路徑」欄位中指定模組 (JAR 檔) 的名稱。 如果您選擇新增含有路徑的模組,您必須指定 EAR 檔根目錄的相對路徑。

若要參照類別檔,您必須指定相對於 EAR 檔根目錄的目錄。 使用組合工具,您可以將個別類別檔新增至 EAR 檔。 建議將這些額外的類別檔包裝在 JAR 檔中。 將這個 JAR 檔新增至模組類別路徑欄位。 如果您將類別檔新增至 EAR 檔的根目錄,請新增 ./ 模組類別路徑欄位。

請考量下列範例目錄結構,其中檔案 myapp.ear 包含名為 myclient.jar 的應用程式用戶端 JAR 檔及 mybeans.jar EJB 模組。 其他類別位於 class1.jarutility/class2.zip 檔案中。 名為 xyz.class 的類別檔未包裝在 JAR 檔中,但位於 EAR 檔的根目錄中。 指定 ./ mybeans.jar utility/class2.zip class1.jar 作為 Classpath 內容的值。 搜尋順序為: myapp.ear/myclient.jar myapp.ear/xyz.class myapp.ear/mybeans.jar myapp.ear/utility/class2.zip myapp.ear/class1.jar

參照不在 EAR 檔中的類別

使用 launchClient -CCclasspath 參數。 此參數在執行時期指定,並採用平台專用的類別路徑值,這表示多個值以分號或冒號區隔。 用戶端與伺服器在這方面類似。

資源類別路徑

當您使用「應用程式用戶端資源配置工具」來配置用戶端應用程式所使用的資源時,您可以指定資源所需的類別路徑。 例如,如果您的應用程式使用 JDBC 至 DB2® 資料庫,請將 db2java.zip 新增至資料庫提供者的類別路徑欄位。 這些類別路徑值是平台專用的,需要分號或冒號來區隔多個值。

在 WebSphere Application Server for i5/OS上,如果您使用 IBM® Developer Kit for Java JDBC 提供者來存取 DB2/400, 您不需要將 db2_classes.jar 檔新增至類別路徑。 不過,如果您使用 IBM Toolbox for Java JDBC 提供者,請指定 jt400.jar 檔的位置。

使用 launchClient API

如果您使用 launchClient 指令,則會為您建立 WebSphere 類別載入器階層。 不過,如果您使用 launchClient API ,則必須自行執行此設定。 在定義 Java 系統內容時複製 launchClient Shell 指令。