java 的新入門者對(duì)classpath往往比較困惑,為何在開發(fā)環(huán)境中能運(yùn)行的東東出去就不好,或在外面運(yùn)行的東東挺溜的進(jìn)了開發(fā)環(huán)境就死菜,煩死了! 看完俺這篇文章包您萬事無憂(夸張點(diǎn)吧) :)呵呵
java的優(yōu)點(diǎn)就是他是一個(gè)自動(dòng)支持網(wǎng)絡(luò)功能的東東,舉一個(gè)簡(jiǎn)單例子來將 比方有一個(gè)Application他用到了java.lang.String(事實(shí)上要是有一個(gè)程序沒用到它,太難以想象了 :)), 和com.shinechina.MyClass(我自己寫的兩個(gè)版本) 這兩個(gè)類
版本1:
package com.shinechina;

public class MyClass
{

public static void main(String args[])
{
String str = "版本1: hello, welcome to chinaasp java 技術(shù)";
System.out.println(str);
}
}
版本2:
package com.shinechina;

public class MyClass
{

public static void main(String args[])
{
String str = "版本2:hello, welcome to chinaasp java 技術(shù)";
System.out.println(str);
}
}
現(xiàn)在我要運(yùn)行它了 java com.shinechina.MyClass 現(xiàn)在問題來了,也許com.shinechina.Myclass在c:, d:, 甚至在阿龍老兄,javabeans老兄,的機(jī)器上也有這么個(gè)東東,里面是些很cool的 java怎么知道到何處找呢?
他到底該怎么辦 假定版本一在 c:/mylib/comshinechina/MyClass.java, 假定版本二在d:/mylib/comshinechina/MyClass.java 注意:不要忘了編譯成class文件吆, java文件是不能執(zhí)行的
cd c:/mylib/comshinechina/ javac *.java
cd d:/mylib/comshinechina/ javac *.java
有了: 他先到機(jī)器的CLASSPATH去找。假設(shè)是windows系統(tǒng) c:/mylib;d:/mylib;d:/jdk1.2.2/lib/t.jar; 或unix系統(tǒng) /home/local/:/usr/local/:/usr/local/jdk1.2.2/lib/rt.jar 好, c:/mylib下他找到了com目錄,有戲, 又往下找又有shinechina目錄,目錄下找到了MyClass.class, Ok 就是他了, 至于d:/mylib我的版本2的MyClass他就不理會(huì)了, 至于String是在rt.jar壓縮包中待會(huì)再講他 執(zhí)行的結(jié)果就是:
版本1: hello, welcome to chinaasp java 技術(shù)
反過來如果d盤的路徑在c:之前,執(zhí)行的結(jié)果就是
版本2: hello, welcome to chinaasp java 技術(shù)
依次類推, 只有在類路徑上第一個(gè)找到的才會(huì)執(zhí)行,你要控制他執(zhí)行那一個(gè)須如此: java -classpath d:/mylib;%classpath% com.shinechina.MyClass 執(zhí)行的結(jié)果就是
版本2: hello, welcome to chinaasp java 技術(shù)
開發(fā)環(huán)境中的執(zhí)行就是這樣,總有一個(gè)地方指定類路徑的
注意,開發(fā)環(huán)境往往不去讀系統(tǒng)路徑, 這也就是在外面運(yùn)行的東東挺溜的進(jìn)了開發(fā)環(huán)境就死菜的原因嘍。 比如說jbuilder, jdevoloper從菜單project->project properties...->paths標(biāo)簽->Add...->添加定義好的library點(diǎn)ok或者new->輸入name和classpath->ok 這個(gè)東東就被添加到了classpath中(運(yùn)行時(shí)可在message view中看到)
再比如說visualAge for java , 點(diǎn)中你要運(yùn)行的類->鼠標(biāo)右擊選中特性->類路徑標(biāo)簽
1。->編輯->全選,好,開發(fā)環(huán)境中的所有類都能找到了
2。->立即計(jì)算(只選中你需要的類, 如果有用class.forName之類通過程序顯式裝載的類的話,需要自己從編輯中手工家入了, 開發(fā)環(huán)境每能力幫你算出來了,如果內(nèi)存沒有問題的話,直接編輯->全選更方便吆)
3。如果你的類并不想引入開發(fā)環(huán)境的話,點(diǎn)中添加額外路徑,編輯(下面的一個(gè)), 我不喜歡這樣, 就不詳細(xì)介紹了 高手的話,直接用jdk, 那么只好麻煩你要么加到系統(tǒng)classpath中(unix下為$CLASSPATH), 要么編譯運(yùn)行時(shí)顯式指明classpath
下面介紹一個(gè)初學(xué)者最容易犯的錯(cuò)誤 還以上節(jié)介紹的例子 假定版本一在 c:/mylib/comshinechina/MyClass.java 編譯后c:/mylib/comshinechina/MyClass.class 怎么指定classpath呢?
常見毛病 1。c:\mylib\comshinechina 2。c:\mylib\com
正確 1。c:\mylib 2。c:\mylib
設(shè)置類路徑結(jié)構(gòu) 可通過對(duì) JDK 工具使用 -classpath 選項(xiàng)(首選方法)或設(shè)置 CLASSPATH 環(huán)境變量來設(shè)置類路徑。
C:> jdkTool -classpath path1;path2...
C:> set CLASSPATH=path1;path2...
每個(gè) path 以文件名或目錄結(jié)尾,該文件名或目錄取決于將類路徑設(shè)置成什么:
對(duì)于包含 .class 文件的 .zip 或 .jar 文件,路徑以 .zip 或 .jar 文件名結(jié)尾。 對(duì)于未命名包中的 .class 文件,路徑以包含 .class 文件的目錄結(jié)尾。 對(duì)于已命名包中的 .class 文件,路徑以包含“root”包(完整包名中的第一個(gè)包)的目錄結(jié)尾。 用分號(hào)來分隔多個(gè)項(xiàng)目。
使用 set 命令時(shí),需要省略等號(hào)兩邊的空格(=)。其中 jdkTool 可以為 java、javac、javadoc,等等。有關(guān)詳細(xì)列表,參見 JDK 開發(fā)工具。 說明 類路徑告訴 Java 應(yīng)用程序去哪里查找第三方和自定義類 -- 即不是 Java 擴(kuò)展或 Java 平臺(tái)一部分的類。
在 JDK 1.2 中,JVM 和其他 JDK 工具通過依次搜索平臺(tái)庫(kù)、庫(kù)擴(kuò)展和類路徑來查找類(有關(guān)搜索策略的詳細(xì)信息,參見如何查找類)。 多數(shù)應(yīng)用程序的類庫(kù)都會(huì)充分利用擴(kuò)展機(jī)制。因此,只有想要加載某個(gè)類庫(kù) (a) 未位于當(dāng)前目錄或其分枝包中 且 (b) 未位于擴(kuò)展機(jī)制所指定的位置時(shí),才需設(shè)置類路徑。
如果用戶是從舊版本 JDK 升級(jí)而來,則啟動(dòng)設(shè)置可能包括不再需要的 CLASSPATH 設(shè)置。這時(shí)應(yīng)該刪除任何非應(yīng)用程序特定的設(shè)置。有些使用 Java 虛擬機(jī)的第三方應(yīng)用程序可能修改 CLASSPATH 環(huán)境變量以包括它們使用的類庫(kù)。這種設(shè)置可以保留。
可通過在調(diào)用 JVM 或其他 JDK 工具時(shí)使用 Java 工具的 -classpath 選項(xiàng)改變類路徑(例如: java -classpath ...)。這是改變類路徑的首選方法。還可通過使用 CLASSPATH 環(huán)境變量改變類路徑。 注意:JDK 1.2 缺省類路徑是當(dāng)前目錄。設(shè)置 CLASSPATH 變量或使用 -classpath 命令行開關(guān)將覆蓋缺省值,因而如果想要在搜索路徑中包括當(dāng)前目錄,則必須在新設(shè)置中包括“.”。
類可以存儲(chǔ)在目錄(文件夾)或歸檔文件(例如 classes.zip 或 classes.jar)中。有關(guān)歸檔文件的詳細(xì)信息和類路徑的工作原理,參見本文檔最后的理解類路徑和包名。
重要說明:JDK 舊版本在缺省類路徑中還包括 /classes 項(xiàng)。該目錄僅供 JDK 使用,且不用于應(yīng)用程序類。應(yīng)用程序類應(yīng)該放置在 JDK 外部的目錄。這樣,安裝新 JDK 時(shí)不必需要重新安裝應(yīng)用程序庫(kù)。為了與舊版本的兼容性,使用 /classes 目錄作為類庫(kù)的應(yīng)用程序在當(dāng)前版本中仍能運(yùn)行,但不能保證在以后的版本中它們還能運(yùn)行。
使用 Java 工具的 -classpath 選項(xiàng) Java 工具 java、jdb、javac 和 javah 具有 -classpath 選項(xiàng),在工具運(yùn)行時(shí)它將取代缺省類路徑或由 CLASSPATH 環(huán)境變量所指定的類路徑。這是改變類路徑設(shè)置的推薦方法,因?yàn)檫@樣每個(gè)應(yīng)用程序可具有它所需的類路徑而又不會(huì)干擾其他應(yīng)用程序。
運(yùn)行時(shí)工具 java 和 jdb 還具有 -cp 選項(xiàng)。該選項(xiàng)是 -classpath 的縮寫。 對(duì)于非常特殊的情況,java 和 javac 都具有開關(guān),使得可改變它們使用的路徑以查找它們自己的類庫(kù)。但是,絕大多數(shù)用戶從來都不會(huì)用到這些開關(guān)。
使用 CLASSPATH 環(huán)境變量 如前一節(jié)中所述,一般用戶將想要使用 -classpath 命令行選項(xiàng)。本節(jié)將介紹如何設(shè)置 CLASSPATH 環(huán)境變量或清除以前安裝遺留下的設(shè)置。
1.設(shè)置 CLASSPATH 在 DOS 提示符下,可用 set 命令修改 CLASSPATH 環(huán)境變量。其格式為: set CLASSPATH=path1;path2 ... 路徑應(yīng)該以指定驅(qū)動(dòng)器的字母開頭,例如 C:...。這樣,在偶然切換到不同驅(qū)動(dòng)器時(shí)仍可找到類(例如,如果路徑項(xiàng)以 ... 開頭,并且當(dāng)前位于驅(qū)動(dòng)器 D: 上,則所需的類將在 D: 而不是 C: 驅(qū)動(dòng)器上找)。
2.清除 CLASSPATH 如果 CLASSPATH 環(huán)境變量被設(shè)置成不正確的值,或啟動(dòng)文件或腳本程序設(shè)置了不正確路徑,則可通過使用下列命令清除 CLASSPATH: C:> set CLASSPATH= 該命令僅清除當(dāng)前會(huì)話的 CLASSPATH。要確保在以后的會(huì)話中具有正確的 CLASSPATH 設(shè)置,則應(yīng)該刪除或修改啟動(dòng)設(shè)置。
更改啟動(dòng)設(shè)置 如果在系統(tǒng)啟動(dòng)時(shí)設(shè)置 CLASSPATH 變量,則查找它的位置取決于所使用的操作系統(tǒng): 操作系統(tǒng) 方法 Windows 98 和 Windows 95 檢查 autoexec.bat 文件中的 set 命令。 Windows NT 啟動(dòng)“控制面板”,選擇“系統(tǒng)”,單擊“環(huán)境”選項(xiàng)卡,并在“用戶變量”部分中,檢查 CLASSPATH 變量。 理解類路徑和包名 Java 類被組織成包,而這些包被映射到文件系統(tǒng)中的目錄。
但是與文件系統(tǒng)不同的是,無論何時(shí)指定包名,都應(yīng)指定完整包名 -- 永遠(yuǎn)不要僅指定它的一部分。例如,java.awt.Button 的包名總是應(yīng)指定為 java.awt。 例如,假定想要 Java 運(yùn)行環(huán)境在包 utility.myapp 中查找名為 Cool.class 的類。如果該目錄的路徑為 C:javaMyClassesutilitymyapp,則應(yīng)該將類路徑設(shè)置成包含 C:javaMyClasses。 要運(yùn)行該應(yīng)用程序,可使用下述 JVM 命令:
C:> java -classpath C:\java\MyClasses\utility.myapp.Cool
當(dāng)該應(yīng)用程序運(yùn)行時(shí),JVM 使用類路徑設(shè)置查找在 utility.myapp 包中定義的任何其他類。
注意:應(yīng)在命令中指定完整包名。例如,設(shè)置類路徑包含 C:\java\MyClasse\sutility 并使用命令 java myapp.Cool 是不可能的,因?yàn)檫@找不到該類。 (您可能想知道用什么定義類的包名。答案是:包名是類的一部分,并且不能修改,除非重新編譯該類。)
注意:包規(guī)范機(jī)制一個(gè)有趣的結(jié)果是,屬于相同包的多個(gè)文件實(shí)際上可存在于不同的目錄中。對(duì)于每個(gè)類,包名都是相同的,但是每個(gè)文件的路徑可從類路徑中的不同目錄開始。 文件夾和歸檔文件 當(dāng)類存儲(chǔ)在目錄(文件夾)中時(shí),例如 c:javaMyClassesutilitymyapp,則類路徑項(xiàng)指向包含包名第一個(gè)元素的目錄(在這里為 C:javaMyClasses,因?yàn)榘?utility.myapp)。
但是當(dāng)類存儲(chǔ)在歸檔文件(.zip 或 .jar 文件)中時(shí),類路徑項(xiàng)則是該 .zip 或 .jar 文件的路徑。例如,要使用位于 .jar 文件中的類庫(kù),則命令應(yīng)該類似下述形式: java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool 多重指定 要在目錄 C:\java\MyClasses 和 C:\java\OtherClasses 中查找類文件,則可將類路徑設(shè)置為: java -classpath C:\java\MyClasses;C:\java\OtherClasses ... 注意兩個(gè)路徑之間用分號(hào)分隔。
指定次序 指定多個(gè)類路徑項(xiàng)的次序是相當(dāng)重要的。Java 解釋器將按照目錄在類路徑變量中的次序在各個(gè)目錄中查找類。在上例中,Java 解釋器首先在目錄 C:\java\MyClasses 中查找需要的類。只有當(dāng)它在該目錄中沒有找到該類時(shí),解釋器才能到 C:\java\OtherClasses 目錄中查找。