java中classpath設置

classpath問題可以說是所有初學者頭疼的問題,偶也一樣。
現將自己的經驗說說:(我的中文不好,大家將就一下,對不起)
1) classpath的作用:
它的作用就事讓java找到你所要執行,或你擁有的類。

2) classpath的設置:
設置classpath,一般可以在2個地方進行,

一是系統環境,如Windows98 中autoexec.bat文件中,每次開機自動設置。
Windows2000 中系統設置,加入classpath項 等等。
二是在執行時,如java -classpath C:/Project;%classpath% myclass
這樣就就在原本的classpath中加入了C:/Project這個目錄。

3) 用途(怎麼用):
這也許是最大的問題,偶慢慢說。

classpath有點類似path,但不完全是。
一般我們在一個類中聲明包名:如
package mypackage.first;
import java.io.*;
public class myfirst { ....}

那麼就是把myfirst這個類放進mypackage裏的first裏面。大家可以把mypackage和first當作目錄,但是你不能在 mypackage/first裏執行java myfirst 。因爲這樣java會認爲你是在找默認目錄(即classpath)裏找myfirst類,而不是mypackage.first裏面的myfirst 類。什麼意思呢?
這是因爲java只會在classpath中找有關java的東西,不會理會path。只有這樣才能跨平臺。
classpath中加個.(點)表示當前目錄,即在當前目錄尋找java的類,不理會其他目錄。
(注意:java本身的類,如java.io.*;java awt.*;等等會自動包括進去,不用指定)

大家也許認爲這很麻煩,但這非常有用,如果你要管理你的文件時。比如說我有10個EJB的client,分別對應不同的EJB,那麼你可以把這10個client分別放入各自的EJB包中,以免混亂。如:
myejb.helloworld.client;
myejb.firstEJB.client; 等等。

舉個例子:
classpath=C:/Project;D:/;
你在C:/Project裏有first,helloworld目錄,裏面相應有各自的client文件(已編譯)。
給出first目錄的client.java作例:
package first;
import java.io.*;
public class client
{
public static void main(String args[])
{
System.out.println("first.client invoked!!");
}
}
編譯:在 C:/Project/first> javac *.java
那麼你就可以在任何DOS目錄執行java first.client ,這都會啓動這個client,而不會啓動helloworld裏的,或其他的。

如果你在classpath中加了.(點), 如classpath=.;D:/;
那麼你必須要在C:/Project>裏面執行上述語句,因爲這表示在D:/和當前目錄尋找,否則java會報錯 ClassNoFoundException 。這點要注意。

我想這也差不多了,雖然短了點,但是精就行了,有問題跟貼。

謝謝你讀完這篇文章。

這裏,我舉一個例子讓讀者更容易理解classpath的作用。

假設有100座樓房,從Building001到Build100依次編號,
並且每一座樓房都有100個住戶,也從Resident001到Resident100依次編號。
這100座樓,可以在亞洲,也可以在歐洲。

那麼,這裏的區域,就是DOS目錄(就是你存放package的地方)。
這裏的樓房,就有點類似於package。
這裏的住戶,就是你所建立的類(class)。
如,第55號樓39號住戶, 那麼就可以表示爲:
package Building55;
public class Resident39
{
...//省略 實現代碼
}
目錄方面:
C:/
|------亞洲(區域的作用,也可作爲package作用)
| |----Building001(package的作用)
| | |-----Resident001.....到Resident100(A)
| |
| |----Building002
| | |-----Resident001.....到Resident100
| |
| |----Building003
| | |-----Resident001.....到Resident100
| |
| |----Building...
| | |-----Resident..........
| |
| |----Building050
| |-----Resident001.....到Resident100
|
|------歐洲(區域的作用,也可作爲package作用)
|----Building051(package的作用)
|-----Resident001.....到Resident100(B)
|----Building052
|-----Resident001.....到Resident100
|----Building053
|-----Resident001.....到Resident100
|----Building...
|-----Resident..........
|----Building100
|-----Resident001.....到Resident100

這裏的A,可以有多種表示方法: 推薦方法(1)

1。設classpath=C:/;

Java文件:C:/亞洲/Building001/Resident001.java
package 亞洲.Building001;
public class Resident001
{
.....//省略
}

運行:1) C:/亞洲/Building001>javac *.java
2) C:/任何目錄/>java 亞洲.Building001.Resident001

2。設classpath=C:/亞洲;

Java文件:C:/亞洲/Building001/Resident001.java
package Building001;//不是 “亞洲.Building001” 了
public class Resident001
{
.....//省略
}
運行:1) C:/亞洲/Building001>javac *.java
2) C:/任何目錄/>java Building001.Resident001
注:這樣設置的話,有可能會引發包名衝突。
如:
classpath=C:/亞洲;C:/歐洲;
歐洲也有同樣的Building001.Resident001的話。

3。設classpath=C:/亞洲/Building001;

Java文件:C:/亞洲/Building001/Resident001.java

//沒有package 聲明語句。
public class Resident001
{
.....//省略
}
運行:1) C:/亞洲/Building001>javac *.java
2) C:/任何目錄/>java Building001.Resident001
注:這樣會與(2)有相同的問題,就是包名衝突。

三種方法都介紹完了。下來有令一個問題。


就是訪問包。
其實很簡單的。就像訪問住戶一樣。
需要知道 洲際板塊,建築編號(package的聲明)。
需要去哪個住戶,就從哪個建築去/或者先去某板塊(呵呵)。。。
而不能直接去某個住戶。
如:
C:/
|------亞洲(區域的作用,也可作爲package作用)
| |----Building001(package的作用)
| | |-----Resident001.....到Resident100(A)
| |
| |----Building002
| | |-----Resident001.....到Resident100
....
(A)的表示是:
package 亞洲.Building001;
public class Resident100
{
....//省略
}
那麼:在classpath設置正確的情況下,你需要執行
C:/任意目錄/>java 亞洲.Building001.Resident100
而不是
C:/亞洲/Building001>java Resident100

C:/亞洲>java Building001.Resident100

總結一下:就是 要和包聲明的等級一樣。不能省略,也不能添加。
(完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章