classpath顧名思義,就是把四面八方的jar都經過字符串的形式寫入文件,而後供項目調用的,這樣既方便,又簡潔,還能夠根據這個進行打包。classpath問題相信是全部初學者比較頭疼的問題。java
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 。這點要注意。
我想這也差很少了,雖然短了點,可是精就好了,有問題跟貼,或者直接加***流,羣號:457036818。
這裏,我舉一個例子讓讀者更容易理解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
總而言之就是 要和包聲明的等級同樣。不能省略,也不能添加。ide