Java 類路徑

Java 類路徑告訴 java 解釋器和 javac 編譯器去哪里找它們要執行或導入的類。類(您可能注意到的那些 *.class 文件)可以存儲在目錄或 jar 文件中,或者存儲在兩者的組合中,但是只有在它們位于類路徑中的某個地方時,Java 編譯器或解釋器才可以找到它們。

在 Windows® 中,類路徑中的多個項是用分號分隔( ;)的,而在 UNIX® 中,這些項是用冒號分隔( :)的。在以下實例中,類路徑中包括兩個 Cloudscape jar 文件( cs.jarcstools.jar ),以及一個存儲 *.class 文件的目錄位置( myDevDir ):

Windows 類路徑:
            c:\Cloudscape_10.0\lib\cs.jar;c:\Cloudscape_10.0\lib\cstools.jar;c:\myPath\myDevDir
            UNIX 類路徑:
            /Cloudscape_10.0/lib/cs.jar:/Cloudscape_10.0/lib/cstools.jar:/myPath/myDevDir
            

本文中的其余實例使用的都是 Windows 語法,因此,如果您是在 UNIX 機器上,那么需要對語法進行相應的調整。





回頁首


Cloudscape 類路徑

Cloudscape 類路徑允許您在數據庫本身中存儲 jar 文件。

在 Cloudscape 10.0 中, sqlj.install_jar() 過程在數據庫中安裝了一個 jar 文件,而且 SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY 過程設置了 cloudscape.database.classpath 屬性。Cloudscape 首先在 Java 類路徑中查找類,然后在數據庫類路徑中進行查找。

我們提及 Cloudscape 類路徑是為了讓您知道該功能,但是接下來,本文將重點關注 Java 類路徑。





回頁首


設置 Java 類路徑

有三種方式設置 Java 類路徑:

  • 永久地,通過在系統級上設置 CLASSPATH 環境變量來實現。
  • 臨時地,通過在命令窗口或 shell 中設置 CLASSPATH 環境變量來實現。
  • 在運行時進行,每次啟動 Java 應用程序和 JVM,都要指定類路徑。

下面的小節中包含以各種方式來設置類路徑的實例,并且都假定您已經將 CLOUDSCAPE_INSTALL 環境變量設置為 Cloudscape 的安裝位置;例如:

C:\>set CLOUDSCAPE_INSTALL=C:\Cloudscape_10.0

為了增加本文的可讀性,我常常將命令分割成幾行。此外,還請記住,Java 類路徑由一個或多個項組成,在 Windows 中,這些項用分號分隔( ;),而在 UNIX 中,這些項是用冒號分隔( :)的。這些實例展示的是 Windows 語法,因此,對于 UNIX,您必須進行調整。

永久地設置類路徑

圖 1 使用控制面板的系統設置來添加名為 CLASSPATH 的新變量,從而永久性地設置 Windows 環境變量。



圖 1. 在 Windows 中通過系統設置來永久設置 CLASSPATH 環境變量
Windows CLASSPATH 環境變量

UNIX 用戶可以通過向 .profile.cshrc 文件添加 CLASSPATH 變量來永久設置類路徑。

臨時設置類路徑

SimpleApp 客戶機類包含在 %CLOUDSCAPE_INSTALL%\demo\programs\simple 下的 Cloudscape 10.0 軟件發行版中。在嵌入式模式中運行該類還需要 %CLOUDSCAPE%\lib\cs.jar 文件。清單 1 展示了在運行 SimpleApp 之前,如何在 Windows 命令窗口中臨時設置 CLASSPATH ,以包含 cs.jar 和當前工作目錄。



清單 1. 臨時設置 Java CLASSPATH
C:\>set CLASSPATH=%CLOUDSCAPE_INSTALL%\lib\cs.jar;.;
            C:\>cd %CLOUDSCAPE_INSTALL%\demo\programs\simple
            C:\Cloudscape_10.0\demo\programs\simple>java SimpleApp
            SimpleApp starting in embedded mode.
            Loaded the appropriate driver.
            Connected to and created database cloudscapeDB
            Created table cloudscapeDB
            Inserted 1956 Webster
            Inserted 1910 Union
            Updated 1956 Webster to 180 Grand
            Updated 180 Grand to 300 Lakeshore
            Verified the rows
            Dropped table cloudscapeDB
            Closed result set and statement
            Committed transaction and closed connection
            Database shut down normally
            SimpleApp finished 

如果是臨時設置類路徑,那么每次打開新的命令窗口時,都需要再次設置它。

在運行時設置類路徑

清單 2 展示了如何在運行時使用 -cp 選項來指定類路徑,這里的運行時是指啟動應用程序和 JVM 時。



清單 2. 在運行時用 -cp 選項設置 Java 類路徑
C:\Cloudscape_10.0\demo\programs\simple>java -cp  %CLOUDSCAPE_INSTALL%\lib\cs.jar; SimpleApp
            SimpleApp starting in embedded mode.
            Loaded the appropriate driver.
            Connected to and created database cloudscapeDB
            Created table cloudscapeDB
            Inserted 1956 Webster
            Inserted 1910 Union
            Updated 1956 Webster to 180 Grand
            Updated 180 Grand to 300 Lakeshore
            Verified the rows
            Dropped table cloudscapeDB
            Closed result set and statement
            Committed transaction and closed connection
            Database shut down normally
            SimpleApp finished





回頁首


一個 'ij' 實例

現在,讓我們來看一個完整的實例,它展示了如何設置類路徑,以便運行 ij 這個 Cloudscape SQL 腳本編制工具。 清單 3CLASSPATH 環境變量設置為 Cloudscape 10.0 運行 ij 所需的最低要求值。



清單 3. 設置 Java CLASSPATH
C:\my_dir>set CLOUDSCAPE_INSTALL=c:\Cloudscape_10.0
            C:\my_dir>set CLASSPATH=%CLOUDSCAPE_INSTALL%\lib\cs.jar;%CLOUDSCAPE_INSTALL%\lib\cstools.jar
            C:\my_dir>echo %CLASSPATH%
            c:\Cloudscape_10.0\lib\cs.jar;c:\Cloudscape_10.0\lib\cstools.jar
            

如果正確設置了 CLASSPATH ,并且在 c:\Cloudscape_10.0 中真正安裝了 Cloudscape,那么 清單 4 中展示的命令就會報告有用的 Cloudscape 10.0 版本信息:



清單 4. 輸出 Cloudscape 10.0 版本信息
C:\Cloudscape_10.0>java com.ihost.cs.tools.sysinfo
            ------------------ Java Information ------------------
            Java Version:    1.4.1_02
            Java Vendor:     Sun Microsystems Inc.
            Java home:       C:\Program Files\Java\j2re1.4.1_02
            Java classpath:  c:\Cloudscape_10.0\lib\cs.jar;c:\Cloudscape_10.0\lib\cstools.jar
            OS name:         Windows 2000
            OS architecture: x86
            OS version:      5.0
            Java user name:  jta
            Java user home:  C:\Documents and Settings\jta
            Java user dir:   C:\Cloudscape_10.0
            --------- Cloudscape Information --------
            [C:\Cloudscape_10.0\lib\cs.jar] 10.0.1.0 beta - (29729)
            [C:\Cloudscape_10.0\lib\cstools.jar] 10.0.1.0 - (29729)
            ------------------------------------------------------
            ----------------- Locale Information -----------------
            ------------------------------------------------------

通過正確設置 Java 類路徑,可以成功啟動 ij ,如下所示:

C:\Cloudscape_10.0>java com.ihost.cs.tools.ij
            ij version 10.0 (c) 1997, 2004 IBM Corp.
            ij> 

然而,如果類路徑的設置不正確,那么應該輸出版本信息的命令就會輸出一個令人泄氣的 NoClassDefFoundError 錯誤:

C:\mydir>java com.ihost.cs.tools.sysinfo
            Exception in thread "main" java.lang.NoClassDefFoundError: com/ihost/cs/tools/sysinfo

NoClassDefFoundErrorClassNotFoundException 是沒有適當設置類路徑時的常見錯誤。第一個意味著無法找到類本身。第二個意味著找到了類,但是沒有找到它所導入的某個類。有關的更多信息,請參閱標題為 常見類路徑錯誤的小節。





回頁首


Cloudscape 庫和包名

各種 Cloudscape 對象(例如庫、包、驅動程序和工具)的名稱在不同的產品版本中會所變化。下面的 表 1總結了不同版本的 Cloudscape 名稱。有關 Cloudscape 名稱的完整信息,請查閱 Cloudscape 軟件發布中的文檔。

表 1. Cloudscape 庫和包

名稱 10.0 Beta 5.1 4.0
Cloudscape 引擎:嵌入式數據庫 cs.jar db2j.jar cloudscape.jar
Cloudscape 工具 cstools.jar db2jtools.jar cloudutil.jar
Cview - db2jcview.jar cloudview.jar
Cview的幫助系統 - jh.jar jh.jar
Cloudscape 網絡服務器函數 csnet.jar db2jnet.jar -
DB2 JDBC 通用驅動程序 (名稱無改變) db2jcc.jar db2jcc.jar -
許可證文件 db2jcc_license_c.jar db2jcc_license_c.jar,
db2jcc_license_cu.jar,
db2jcc_license_cisuz.jar
-
包名 com.ihost.cs com.ibm.db2j COM.cloudscape

清單 1和清單 2 展示了如何在嵌入式模式中運行 %CLOUDSCAPE_INSTALL%\demo\programs\simple\SimpleApp 。嵌入式模式極其簡單,只需在類路徑中包括 cs.jar 即可。不過,您也可以在網絡服務器模式中運行 SimpleApp 實例,為此,您需要在類路徑中包括下方列出的庫(還需要啟動網絡服務器):

  • cs.jar
  • csnet.jar
  • db2jcc.jar
  • db2jcc_license_c.jar

請注意,Cloudscape 名稱將在版本 10.0 Beta 和 10.0 GA 之間發生改變。當它們變得可用時,本文將用新的名稱對它們進行更新。





回頁首


檢測問題

常見類路徑錯誤

主要有兩種類型的類路徑問題。第一類問題發生在沒有從類路徑中找到您試圖使用的 Java 類時,此時,它拋出一個 java.lang.ClassNotFoundException 異常。第二類問題發生在找到了您正試圖使用的類,但沒有找到它所導入的某個類時。本例中,在編譯時顯示了所導入的類,但在運行時,所導入的類沒有包含在類路徑中。這將拋出一個 java.lang.NoClassDefFoundError 異常。還有另一種考慮 NoClassDefFoundError 的方式,也就是說,在編譯當前執行的類時,所搜索的類定義是存在的,但在運行時卻再也無法找到該定義了。

如何可以解決這類問題呢?首先,檢查類路徑,驗證庫是否真正位于您認為的地方。例如,在 Windows 中使用該命令來輸出類路徑:

C:\my_dir>echo %CLASSPATH%
            c:\Cloudscape_10.0\lib\cs.jar;c:\Cloudscape_10.0\lib\cstools.jar
            

然后,在 CLASSPATH 變量中查看每個路徑,并用 dir (Windows)或 ls (UNIX)命令查看這些文件是否存在。

如果不知道類位于哪個 jar 文件中,可以用以下命令來檢查:

jar -tvf cs.jar | more
            

該命令產生許多輸出。如果正使用 Linux 或 Unix,或者在 Windows 中使用 UNIX 使用程序,那么您可以用 grep 篩選您所查找的類。例如,以下命令將查找 com.ihost.cs.tools.sysinfo 類:

C:\Cloudscape_10.0\lib>jar -tvf cs.jar | grep -i com.ihost.cs.tools.sysinfo
            1526 Wed Jun 23 19:03:18 PDT 2004 com/ihost/cs/tools/sysinfo.class
            

另一種方法是通過 sysinfo 實用程序來搜索類,這將在下一節中進行描述。

驗證是否獲得您真正需要的所有東西

Cloudscape 軟件發布包括 sysinfo 工具,其中包含驗證類路徑的 -cp 選項。有關的完整信息,請參閱 Cloudscape 軟件發布中的 Tools and Utilities Guide

如果使用時沒有附帶任何附加參數,那么 -cp 選項將測試所有 Cloudscape 庫,輸出它能夠找到以及無法找到的那些庫,如下所示:

C:\Cloudscape_10.0>java com.ihost.cs.tools.sysinfo -cp
            Testing for presence of all Cloudscape-related libraries; typically, only some are needed.
            For a list of possible arguments, type java com.ihost.cs.tools.sysinfo -cp args
            FOUND IN CLASS PATH:
            Cloudscape embedded engine library (cs.jar)
            Cloudscape tools library (cstools.jar)
            NOT FOUND IN CLASS PATH:
            Cloudscape Network Server library (csnet.jar)
            (com.ihost.cs.drda.NetworkServerControl not found.)
            Cloudscape Client libraries (db2jcc.jar)
            (com.ibm.db2.jcc.DB2Driver not found.)
            

-cp 選項的可選參數包括:

  • embedded
  • tools
  • sampleApp
  • anyClass.class

下面的實例將在類路徑中查找 SimpleApp 類:

C:\Cloudscape_10.0\demo\programs\simple>java com.ihost.cs.tools.sysinfo -cp SimpleApp.class
            FOUND IN CLASS PATH:
            NOT FOUND IN CLASS PATH:
            user-specified class (SimpleApp)
            (SimpleApp not found.)
            

如果要在當前工作目錄中運行類,那么請記住,要將該目錄包含在您的路徑中:

C:\Cloudscape_10.0\demo\programs\simple>set CLASSPATH=%CLASSPATH%;.;
            C:\Cloudscape_10.0\demo\programs\simple>java com.ihost.cs.tools.sysinfo -cp SimpleApp.class
            FOUND IN CLASS PATH:
            user-specified class (SimpleApp)
            SUCCESS: All Cloudscape related classes found in class path.
            

最后,改為使用 5.1 包名來測試 Cloudscape 5.1 的類路徑,例如:

java com.ibm.db2j.tools.sysinfo -cp