Java 類路徑
Java 類路徑告訴 java
解釋器和 javac
編譯器去哪里找它們要執行或導入的類。類(您可能注意到的那些 *.class
文件)可以存儲在目錄或 jar 文件中,或者存儲在兩者的組合中,但是只有在它們位于類路徑中的某個地方時,Java 編譯器或解釋器才可以找到它們。
在 Windows® 中,類路徑中的多個項是用分號分隔( ;)的,而在 UNIX® 中,這些項是用冒號分隔( :)的。在以下實例中,類路徑中包括兩個 Cloudscape jar 文件( cs.jar
和 cstools.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 環境變量
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 腳本編制工具。 清單 3 將 CLASSPATH
環境變量設置為 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
|
NoClassDefFoundError
和 ClassNotFoundException
是沒有適當設置類路徑時的常見錯誤。第一個意味著無法找到類本身。第二個意味著找到了類,但是沒有找到它所導入的某個類。有關的更多信息,請參閱標題為 常見類路徑錯誤的小節。
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 文件中,可以用以下命令來檢查:
該命令產生許多輸出。如果正使用 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
|