【JAVA學習】總結classpath常見問題以及解決方法

    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

相關文章
相關標籤/搜索