java中classpath詳細

來源:互聯網
上載者:User
對於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:
package com.shinechina;public class MyClass{   public static void main(String args[])   {      String str = "版本1: hello, welcome to chinaasp java 技術";      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 技術";      System.out.println(str);   }}
   現在我要運行它了  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中

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.