關(guān)于Java的Classpath詳解
Java 的新入門(mén)者對classpath往往比較困惑,為何在開(kāi)發(fā)環(huán)境中能運行的東東出去就不好,或在外面運行的東東挺溜的進(jìn)了開(kāi)發(fā)環(huán)境就死菜。
java的優(yōu)點(diǎn)就是他是一個(gè)自動(dòng)支持網(wǎng)絡(luò )功能的東東,舉一個(gè)簡(jiǎn)單例子來(lái)將
比方有一個(gè)Application用到了java.lang.String(事實(shí)上要是有一個(gè)程序沒(méi)用到它,太難以想象了)和com.shinechina.MyClass(我自己寫(xiě)的)這兩個(gè)類(lèi)。
版本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);
}
}
現在我要運行它了
java com.shinechina.MyClass
現在問(wèn)題來(lái)了
Java怎么知道到何處找呢, 他到底該怎么辦
假定版本一在 c:\mylib\com\shinechina\MyClass.java
假定版本二在 d:\mylib\com\shinechina\MyClass.java
注意:不要忘了編譯成class文件吆, java文件是不能執行的
cd c:\mylib\com\shinechina
javac *.java
cd d:\mylib\com\shinechina
javac *.java
有了:
他先到機器的CLASSPATH去找,假設是windows系統 c:\mylib;d:\mylib;d:\jdk1.2.2\lib\rt.jar;
或 unix系統 /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ì )再講他
執行的結果就是
版本1: hello, welcome to chinaasp java 技術(shù)
反過(guò)來(lái)d盤(pán)的路徑在c:之前,執行的結果就是
版本2: hello, welcome to chinaasp java 技術(shù)
依次類(lèi)推, 只有在類(lèi)路徑上第一個(gè)找到的才會(huì )執行,你要控制他執行那一個(gè)須如此:
java -classpath d:\mylib;%classpath% com.shinechina.MyClass
執行的結果就是
版本2: hello, welcome to chinaasp java 技術(shù)
開(kāi)發(fā)環(huán)境中的執行就是這樣,總有一個(gè)地方指定類(lèi)路徑的。
注意,開(kāi)發(fā)環(huán)境往往不去讀系統路徑, 這也就是在外面運行的東東挺溜的進(jìn)了開(kāi)發(fā)環(huán)境就死菜的原因嘍。
比如說(shuō)jbuilder, jdevoloper從菜單project->project properties...->paths標簽->Add...->添加定義好的library點(diǎn)ok或者new->輸入 name和classpath->ok。這個(gè)東東就被添加到了classpath中(運行時(shí)可在message view中看到)
再比如說(shuō)visualAge for java , 點(diǎn)中你要運行的類(lèi)->鼠標右擊選中特性->類(lèi)路徑標簽1。->編輯->全選,好,開(kāi)發(fā)環(huán)境中的所有類(lèi)都能找到了。
2、立即計算(只選中你需要的類(lèi), 如果有用class.forName之類(lèi)通過(guò)程序顯式裝載的類(lèi)的話(huà),需要自己從編輯中手工家入了, 開(kāi)發(fā)環(huán)境每能力幫你算出來(lái)了,如果內存沒(méi)有問(wèn)題的話(huà),直接編輯->全選更方便吆)
3、如果你的類(lèi)并不想引入開(kāi)發(fā)環(huán)境的話(huà),點(diǎn)中添加額外路徑,編輯(下面的一個(gè)), 我不喜歡這樣, 就不詳細介紹了
高手的話(huà),直接用jdk, 那么只好麻煩你要么加到系統classpath中(unix下為$CLASSPATH), 要么編譯運行時(shí)顯式指明classpath
下面介紹一個(gè)初學(xué)者最容易犯的錯誤
還以上節介紹的例子
假定版本一在 c:\mylib\com\shinechina\MyClass.java
編譯后c:\mylib\com\shinechina\MyClass.class
怎么指定classpath呢
常見(jiàn)毛病
1、c:\mylib\com\shinechina\
2、c:\mylib\com\
正確
1、c:\mylib\
2、c:\mylib
============================================================
在Java程序開(kāi)發(fā)中,ClassPath是尋找Java類(lèi)的路徑,如同DOS里面的path一樣。
Java的類(lèi)的封裝結構是 package.Class,比如說(shuō)我的ClassPath是如下設置的:
set classpath="d:\java_class"
那么我們有一個(gè)類(lèi)是 chen.Rose,編譯好后怎么存放呢?
答案是,我們可以在d:盤(pán)的java_class目錄下建立一個(gè)chen子目錄,然后把Rose.class文件復制到該子目錄下,看起來(lái)好下:
d:\java_class\chen\Rose.class
這樣我們在以后使用時(shí),只需如下調用就可以
import chen.Rose;
class SendRose {
Rose newRose;
... ...
同理,我們建立的chen包下的Flower類(lèi):
package chen;
class Flower {
...
}
編譯后將Flower.class文件復制到 d:\java_class\chen目錄下,
就可以在其它的地方引用了,甚至可以使用 import chen.*;
一些公司把它們的一組類(lèi)往往打包發(fā)行,把這個(gè)包壓縮成Jar或Zip,設置的方法如下:
set classpath="d:\java_class;d:\oracle\ora.jar"
你只需把文件名包含到 classpath中去即可正確地引用該壓縮包中的類(lèi)了。 (如何在代碼中import jar中的class參見(jiàn)最后的總結5))
對于jdk1.3以上的版本,引用java.*,sun.*等系統包不需要設置classpath.
使用當前目錄下的類(lèi)需要將點(diǎn)包含在classpath中,如下所示:
set classpath=".;d:\java_class"
注意:與設置path一樣,不同路徑之間用分號分隔開(kāi)。
=======================================================================
總結:
1、在Java程序開(kāi)發(fā)中,ClassPath是JVM尋找Java類(lèi)的路徑,也是java.exe執行解釋時(shí)需要的類(lèi)路徑。
2、Java類(lèi)的結構是:Package.class (或Package/class),所以,ClassPath設置的路徑不能包括包名(在windows中也就是目錄名)
3、如果你在包含類(lèi)的當前目錄下(不進(jìn)入到包目錄中)執行java.exe pakcage.class,那么不需要設置classpath,因為java.exe可以在默認當前目錄尋找類(lèi)并執行(當然,一個(gè)名為 a.b.class 的類(lèi)首先必須放置到 ..\a\b\目錄下才能被正確找到),但是如果你需要在任何目錄下執行java.exe pakcage.class就必須設置classpath。
4、優(yōu)先級問(wèn)題:因為JDK5.0以上可以不設置classpath在當前目錄下,按包名 對應的目錄尋找到需要執行的類(lèi),但是,如果我們同時(shí)也設定了環(huán)境變量classpath,而且當前路徑下和classpath設定的路徑下有同名的類(lèi),那 么會(huì )執行哪一個(gè)?答案是:環(huán)境變量設置優(yōu)先(也只執行先找到的那一個(gè))。這有兼容性的考慮,因為jdk5.0之前,是必須設置classpath的,沒(méi)有 默認當前路徑的特性。
5)對于一些公司把它們的一組類(lèi)打成 jar包發(fā)行,除了在設置classpath時(shí)用全名,在代碼中需要使用jar中的class時(shí),如何import呢?也很簡(jiǎn)單,以插件 easyexplore.jar為例,先在classpath中設置:set classpath=%classpath%,L:\eclipse\plugins\easyexplore.jar。解開(kāi)jar發(fā)現他的class是 在如下目錄中..\org\sf\easyexplore\,也就是說(shuō)它的class的包名是org.sf.easyexplore,所以在代碼中可以通 過(guò) import org.sf.easyexplore.*; 來(lái)使用他提供的類(lèi)。如果不設置classpath,那么也可以將jar文件放在任何位置,只要在命令行也可以通過(guò)如下形式使用即可。
javac -classpath L:\eclipse\plugins\easyexplore.jar self.java
(self.java就是設置了import,需要使用jar中類(lèi)的源程序,所以,jar可以放置于任何目錄下。但前提是jar包必須在環(huán)境變量的classpath中指定或在命令行的-classpath參數中指定)
如果需要在eclipse中使用,則引入jar文件的流程如下:在工程項目的根目錄點(diǎn)擊右鍵查看屬性(Properties),選擇java build path的條目點(diǎn)擊Libraries標簽,點(diǎn)擊"add External jar" 的按鈕,選取你要載入的jar文件打開(kāi)確定就可以了。