classPath的理解

對於classpath作用的解釋在《Thinking in Java》中有如下解釋:
   Java 解釋器的工作程序如下:
  首先,它找到環境變量CLASSPATH(將Java 或者具有Java 解釋能力的工具——如瀏覽器——安裝到機器中時,通過操作系統進行設定)。CLASSPATH 包含了一個或多個目錄,它們作爲一種特殊的“根”使用,從這裏展開對.class 文件的搜索。從那個根開始,解釋器會尋找包名,並將每個點號(句點)替換成一個斜槓,從而生成從CLASSPATH 根開始的一個路徑名(所以package foo.bar.baz 會變成foo\bar\baz 或者foo/bar/baz;具體是正斜槓還是反斜槓由操作系統決定)。隨後將它們連接到一起,成爲CLASSPATH 內的各個條目(入口)。以後搜索.class 文件時,就可從這些地方開始查找與準備創建的類名對應的名字。此外,它也會搜索一些標準目錄——這些目錄與Java 解釋器駐留的地方有關。
classpath是什麼? 它的作用是什麼?
    classpath是javac編譯器的一個環境變量。
    它的作用是指定類搜索路徑,它與import、package關鍵字有關.
    當你寫下improt java.util.*時,編譯器面對import關鍵字時,就知道你要引入java.util這個package中的類;但是編譯器如何知道你把這個package放在哪裏了呢?所以你首先得告訴編譯器這個package的所在位置;如何告訴它呢?就是設置CLASSPATH啦 :) 如果java.util這個package在c:\jdk\ 目錄下,你得把c:\jdk\這個路徑設置到CLASSPATH中去!當編譯器面對import java.util.*這個語句時,它先會查找CLASSPATH所指定的目錄,並檢視子目錄java\util是否存在,然後找出名稱吻合的已編譯文件(.class文件)。如果沒有找到就會報錯!
    CLASSPATH有點像c\c++編譯器中的INCLUDE路徑的設置哦,是不是?當c\c++編譯器遇到include <iostream>這樣的語句,它是如何運作的?哦,其實道理都差不多!搜索INCLUDE路徑,檢視文件!
    當你自己開發一個package時,然後想要用這個package中的類;自然,你也得把這個package所在的目錄設置到CLASSPATH中去!
CLASSPATH的設定,對JAVA的初學者而言是一件棘手的事。所以Sun讓JAVA2的JDK更聰明一些。你會發現,在你安裝之後,即使完全沒有設定CLASSPATH,你仍然能夠編譯基本的JAVA程序,並且加以執行
    可以看出,CLASSPATH 裏能包含大量備用的搜索路徑。然而,使用JAR 文件時要注意一個問題:必須將JAR文件的名字置於類路徑裏,而不僅僅是它所在的路徑。所以對一個名爲grape.jar 的JAR 文件來說,我們的類路徑需要包括:
   CLASSPATH=.;D:\JAVA \LIB;C:\flavors\grape.jar

   個人理解說明:其實從上面可以看出,如果你用記事本來寫java程序(在Window下),並用cmd命令窗口中輸入javac,java命令,如果你的代碼中用到了其它的jar或者你自己的寫的類,但又和你的主程序沒在一個包下,這時你就要在classpath中設置你要用到的jar或者自己寫的類的路徑,讓Java在編譯器可以找到你要用的東西,如上面例子所示。 在我們用一些工具時,如eclipse中,我們可以把一些Jar包什麼的添加進來,然後搜索路徑的事工具幫我們做了,所以不用在手動加進去。所以在eclipse實際的開發中,沒有用到系統配置的classpath,而是自己會生成一個.classpath的文件;只有用cmd javac 編譯時會用到系統的classpath(這也可以改變,見下)。
   classpath=c:\test就表示執行運行命令時去c:\test文件夾去找需要被執行的class文件
   在java5之前該路徑是不能指定當前路徑的,除非這樣設置:classpath=.;c:\test,就表示先在當前目錄找class文件,要是沒找到就到c:\test去找;(當一個變量有多個值時,多個值之間是有英文的分號隔開),設置從當前所在目錄查找(java1.5後默認):set classpath=.
CLASSPATH環境變量。作用是指定類搜索路徑,要使用已經編寫好的類,前提當然是能夠找到它們了,JVM就是通過CLASSPATH來尋找類的.class文件。我們需要把jdk安裝目錄下的lib子目錄中的dt.jar和tools.jar設置到CLASSPATH中,當然,當前目錄“.”也必須加入到該變量中。
 javac -c  路徑 (可以指定class文件存放目錄)
 java -cp  路徑  (可以指定要執行的class目錄)

   (1).何時需要使用-classpath:當你要編譯或執行的類引用了其它的類,但被引用類的.class文件不在當前目錄下時,就需要通過-classpath來引入類
   (2).何時需要指定路徑:當你要編譯的類所在的目錄和你執行javac命令的目錄不是同一個目錄時,就需要指定源文件的路徑(CLASSPATH是用來指定.class路徑的,不是用來指定.java文件的路徑的)
eg:
   比方有一個Application用到了java.lang.String和com.shinechina.MyClass(我自己寫的)這兩個類。

版本1:
  1. package com.shinechina;
  2. public class MyClass
  3. {
  4. public static void main(String args[])
  5. {
  6. String str = “版本1: hello, welcome to chinaasp java 技術”;
  7. System.out.println(str);
  8. }
  9. }
版本2:
  1. package com.shinechina;
  2. public class MyClass{
  3. public static void main(String args[]){
  4. String str = "版本2:hello,welcome to chinaasp java 技術";
  5. System.out.println(str);
  6. }
  7. }

   現在我要運行它了

  java com.shinechina.MyClass

   現在問題來了

 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他就不理會了,至於String是在rt.jar壓縮包中待會再講他

 執行的結果就是

  版本1: hello, welcome to chinaasp java 技術

 反過來d盤的路徑在c:之前,執行的結果就是

  版本2: hello, welcome to chinaasp java 技術

 依次類推, 只有在類路徑上第一個找到的纔會執行,你要控制他執行那一個須如此:

  java -classpath d:\mylib;%classpath% com.shinechina.MyClass

 執行的結果就是

  版本2: hello, welcome to chinaasp java 技術

 開發環境中的執行就是這樣,總有一個地方指定類路徑的。

 注意,開發環境往往不去讀系統路徑, 這也就是在外面運行的東東挺溜的進了開發環境就死菜的原因嘍。

 比如說jbuilder, jdevoloper從菜單project->project properties...->paths標籤->Add...->添加定義好的library點ok或者new->輸入name和classpath->ok。這個東東就被添加到了classpath中(運行時可在message view中看到)

 再比如說visualAge for java , 點中你要運行的類->鼠標右擊選中特性->類路徑標籤
       1、->編輯->全選,好,開發環境中的所有類都能找到了。

  2、立即計算(只選中你需要的類, 如果有用class.forName之類通過程序顯式裝載的類的話,需要自己從編輯中手工家入了, 開發環境每能力幫你算出來了,如果內存沒有問題的話,直接編輯->全選更方便吆)

  3、如果你的類並不想引入開發環境的話,點中添加額外路徑,編輯(下面的一個), 我不喜歡這樣, 就不詳細介紹了

  高手的話,直接用jdk, 那麼只好麻煩你要麼加到系統classpath中(unix下爲$CLASSPATH), 要麼編譯運行時顯式指明classpath

  下面介紹一個初學者最容易犯的錯誤

  還以上節介紹的例子

  假定版本一在 c:\mylib\com\shinechina\MyClass.java

  編譯後c:\mylib\com\shinechina\MyClass.class

  怎麼指定classpath呢

  常見毛病

   1、c:\mylib\com\shinechina\

   2、c:\mylib\com\

  正確

   1、c:\mylib\

   2、c:\mylib

classpath的重要性
     用eclipse開發項目時,對每個項目都需要配置classpath,具體怎麼配只需要在項目上鼠標右鍵build path.然後一步步操作,你配完之後,打開你的項目所在的workpace,打開你的項目文件,裏面有一個.classpath文件,你打開這個文件之後就會看到你之前在eclipse中build path的結果。比如我在項目中加入了一個我先前自己配置的User Library,名字叫做MysqlJDBCDriver ,加完之後,在我的項目的.classpath文件中多出了一條<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/MysqlJDBCDriver"/>
    我認爲項目是獨立於電腦環境變量的classpath的,每一個項目都需要它特定的classpath,所以在eclipse開發的時候每一個項目都會有一個.classpath文件(ps:爲什麼每個項目需要自己的classpath?因爲每個項目都需要引入自己特定的類庫,而電腦環境變量的classpath是通用的,你不可能讓你的所有項目都只是使用電腦環境變量classpath中設置的這幾個類庫吧)
   我覺得.classpath獨立於電腦的classpath還有一個重要的原因:當你最後做成jar包提供給用戶的時候,用戶想要運行這個jar,你不能奢求用戶的電腦中的classpath有你當前引用包的路徑,因爲用戶的系統是乾淨的,所以我們需要把我們需要引用的包build到.classpath中
            </div>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章