# 摘要

Class Path是Java執行時期環境用來搜尋類別與其它資源所用之路徑。Class Search Path(通常使用Class Path這個縮寫名稱比較為人所知)可以在呼叫SDK工具程式時使用-classpath或者是設定CLASSPATH環境變數。建議是使用-classpath選項,因為您可以獨立的為每一個應用程式設定,而不會影響其它的應用程式,且不會有其它的應用程式來改變這個值。

1
C:> sdkTool -classpath classpath1;classpath2...  

-或-
1
C:> set CLASSPATH=classpath1;classpath2...  


在這邊:
sdkTool:是一個命令列工具程式,像是java、javac 或 javadoc.
classpath1;classpath2:指向.jar、.zip或 .class檔案的Class Path,每一個classpath都應以檔名或目錄名稱(這與您所要設定的classpath有關)作結束。

* 對於一個包括.class的.jar或.zip檔案而言,class path要以.zip或.jar檔案的名稱作結束。
* 對於一個未命名的package而言,class path要以包括所有.class檔案的目錄作結束。
* 對於一個已命名的package而言,class path要以包括"根"package(完整package名稱的第一個package)的目錄名稱作結束。

多個路徑項目要以 分號 作區隔,使用set指令,重要的是等號兩邊不可有空白。

預設的class path是目前的目錄,設定CLASSPATH變數或使用-classpath命令列選項時會覆蓋這個預設,所以如果您要在目前的搜尋路徑中包括目前的目錄,您必須在新設定中包括"." 。

即不是目錄也不是文件檔案(.zip或.java)的classpath會被忽略。

# 說明

class path告訴SDK工具程式與應用程式要到哪邊尋找第三元件(third-party)與使用者定義的classes,也就是它們非Java延伸套件或非Java平台的一部份。在您使用javac編譯器編譯類別時,需要使用class path來找出任何所需的套件 -- 預設是目前的目錄,以方便找到這些類別。

Java2 SDK、JVM與其它的SDK工具藉由搜尋Java平台、classes、其它延伸classes與class path來找到所需的classes,以這個順序(要瞭解搜尋策略的細節,請看如何尋找Classes, How Classes Are Found),大部份應用程式所用的類別庫就可以利用延伸套件機制(extensions mechanism),在您載入一個不在目前目錄的類別或它的其它子目錄且它們不在伸延伸套件機制中時,您所要作的就是設定class path。

如果您從舊版本的SDK昇級上來,在您的啟動設定中可能包括已經不再使用的CLASSPATH設定,您必須將這些非特定應用程式的設定移除,像是classes.zip,一些使用到Java虛擬機器的第三元件應用程式可能會更改您的CLASSPATH環境變數,以將它們所使用的程式庫包括進去,這些設定則可以保留。

在您要求JVM或其它SDK工具程式時,您可以在使用Java工具程式時藉由-classpath選項來改變class path,或是使用CLASSPATH環境變數來指定。建議是使用-classpath選項會比設定CLASSPATH環境變數來得好,因為您可以為每一個應用程式分別設定,而不會影響其它的應 用程式,而其它應用程式也不會改變這個值。

Classes可以被儲存在目錄(資料夾)或是在文件檔案(archive files),Java平台的classes是被儲存在rt.jar,要瞭解文件檔案的細節或是class path如何運作的資訊,請看看稍後小節的 "瞭解class path與package名稱"。

重要、注意:一些舊版本的JDK軟體在預設的class path中包括了<jdk-dir>/classes項目,這些目錄的存在是為了被JDK軟體使用,而不應被應用程式classes使用。應用程式類別應該被放在JDK目錄結構之外的其它目錄,用這種方式,新的JDK就不會強迫您重新安裝應用程式classes,為了要與舊版本相容,必須使用<jdk-dir>/classes目錄作為類別庫的的應用程式,在目前的版本也可以運作,但不保證在未來的版本中仍可以運作。

# 使用SDK工具程式的-classpath選項

SDK工具程式 java、jdb、javac與javah擁有一個-classpath項目,當執行工具程式時,它用於取代由CLASSPATH環境變數所設定的路徑,在改變class path設定時,這是個建議使用的選項,因為每一個應用程式可以擁有自已所需的class path,而不會與其它應用程式相互干擾。

執行時期工具程式java也有一個 -cp 選項,這個選項是-classpath的縮寫名稱。

對於一些相當特殊的例子來說,java與javac都擁有一些項目可以讓您改變它們用來找到專屬類別庫的路徑,然而絕大多數的使用者從未需要使用這些項目。

# 使用CLASSPATH環境變數

一般而言,建議您使用-classpath命令列選項,就如同上面所提過的,這個小節將告讓您如何設定CLASSPATH環境變數,如果您想這麼作的話,或者是想清除之前安裝所留下的設定。

設定 CLASSPATH:

CLASSPATH環境變數可以藉由set指令來修改,格式是:

1
set CLASSPATH=path1;path2 ....  


路徑應該以磁碟機代號開始,例如C:\,用這種方式,即使您切換至另一個磁碟機也可以找得到classes。(舉個例子來說,假如路徑項目以斜線開始而您在磁碟機D:,那麼classes將會預期是在D:,而不是C:)

清除 CLASSPATH:

如果您的CLASSPATH環境變數已經被設定為某個值,但是並不正確,或者是您的啟動檔案或是命令稿被設定了錯誤的路徑,您可以藉由以下來取消CLASSPATH的設定:

1
C:> set CLASSPATH=  


這個指令只取消目前的命令列提示視窗CLASSPATH設定,您應當刪除或修正您的啟動設定,以保證您在下一次操作也會有正確的CLASSPATH設定。

改變啟動設定:

如果CLASSPATH被設定於系統啟動時,設定的地方則視您所使用的作業系統而定:
作業系統方法:
*Windows 95與98 檢查autoexec.bat中的set指令
*其它(Windows NT、Windows 2000、....)使用控制台中的系統工具來設定CLASSPATH變數

# 瞭解class path與package名稱

Java的classes被組織為packages,它們對應於檔案系統的目錄結構,但是不像檔案系統,每當您指定一個package名稱時,您指定整個package名稱而不是部份名稱,例如,java.awt.Button的package名稱是使用java.awt來指定。

例如,假設您要Java執行環境找到一個在 package名稱 utility.myapp 中名叫Cool.class的class,假如該目錄的路徑是C:\java\MyClasses\utility\myapp,您要設定class path以包括 C:\java\MyClasses。

要執行這個應用程式,您可以使用下面的JVM指令:
1
c:> java -classpath C:\java\MyClasses utility.myapp.Cool  


當應用程式執行時,JVM會使用class path設定來找到任一其它被定義於utility.myapp package(它被Cool類別使用)中的類別。

注意在指令中被指定的整個package名稱,這是不可能的,例如,設定class path包括C:\java\MyClasses\utility並使用指令java myapp.Cool,這麼作並不會找到class。

(您可能會想是什麼定義了一個class的package名稱,答案是package名稱是class的一部份,而且不可被修改,除非重新編譯)

注意:一個package指定機制的有趣的結果是,同一個package中的部份檔案可以存在於不同的目錄,對於每一個class而言,package名稱將會相同,但是每一個檔案的路徑將會以class path中不同的目錄開始。

目錄與文件檔案(archive files):

當classes被儲存在目錄(資料夾),像是c:\java\MyClasses\utility\myapp,那麼class path項目指向包括package名稱第一個元素的目錄(在這個例子中是c:\java\MyClasses,因為package名稱是utility.myapp)

但是當classes被儲存在文件檔案時(a.zip或.jar檔案),class path項目就是指向且包括.zip或.jar的檔案,例如,使用在.jar檔案中的類別庫,指令會像是:

1
C:> java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool  


多個指定:

要尋找C:\java\MyClasses中與C:\java\OtherClasses中的classes,您可以這麼設定class path:

1
C:> java -classpath C:\java\MyClasses;C:\java\OtherClasses ...  


注意兩個路徑是以分號作區隔。

指定順序:

指定多個class path項目的順序很重要,Java解碼器(interpreter)會以class path變數 中的順序來於目錄中尋找classes,在上面的例子中,Java解碼器首先會在目錄C:\java\MyClasses中尋找所需的類別,只有在它於該目錄中找不到適當名稱的類別時,解碼器才會於C:\java\OtherClasses目錄中尋找。