熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Classpath和Codebase

2013-11-15 11:36:48  來源: JSP教程 

  概要
  
  Classpath和Codebase是Java中非常重要的兩個概念初學者如果沒有掌握這兩個概念在遇到諸如ClassNotFoundException或者相關的異常時不知所措另外很多其它方面的錯誤往往也和Classpath有關本文將詳細解釋這兩個概念並且描述在命令行方式和集成開發環境(以JBuilder為例)中的設置方式
  
  什麼是Classpath
  
  Classpath是Java中的重要概念它描述了Java虛擬機在運行一個Class時在哪些路徑中加載要運行的類以及運行的類要用到的類簡單的說就是像操作系統的path只不過這個classpath是由Java的虛擬機來使用查找需要加載的類而操作系統的path是由操作系統用來查找用戶輸入的可執行程序同path一樣classpath也是一個環境變量可以通過set命令來設置
  
  Classpath和Java包的關系
  
  Java的包(Package)和classpath關系密切包是以分割的SUN建議使用域名的逆向排列來區分不同的包以避免沖突如panyutil在一個包裡的類在存儲的時候需要存儲在和包名相同的目錄裡如上述panyutil包中的Sampleclass要存儲在com\company\util目錄中
  Classpath有兩種表達方式一種是指向目錄的classpath如C:\work\classes表示C:\work\classes目錄是一個classpath條目另一種方式是指向壓縮文件的classpath如C:\work\utiljar表示C:\work\utiljar文件是一個classpath條目任何一個包含Java類的zip格式的壓縮文件都可以作為classpath的條目
  那麼classpath和包到底是什麼關系呢?簡單的說就是Java虛擬機在加載類的時候以這樣一種方式查找具體的類文件classpath+包存儲的目錄+具體的類文件如classpath中有一個c:\work\classes條目需要加載的類是panyutilSampleclass那麼在加載這個類的時候虛擬機會查找c:\work\classes\com\company\util目錄如果Sampleclass在這個目錄中虛擬機就可以找到如果這個類不在這個目錄中同時也不在任何一個其它classpath中那麼虛擬機會拋出一個ClassNotFoundException
  
  Classpath的順序和類版本沖突
  
  Java虛擬機在加載類的時候查找classpath是有順序的如果在classpath中有多個條目都有同一個名稱的類那麼在較前位置的類會被加載後面的會被忽略這種按照順序的類加載可能會導致類的版本沖突例如classpath=c:\servlet\servletjarc:\servlet\servletjar那麼在實際應用的過程中你使用的是servlet而不是servlet很多時候如果不注意這一點可能會導致奇怪的異常
  
  命令行狀態下的classpath設置
  
  命令行狀態下的classpath可以通過兩種方式設置
  一種是直接設置環境變量例如在windows環境下我們使用set命令
  set classpath=c:\work\classesc:\work\utiljar
  另一種方式是在執行javacjava或者其它Java命令時直接指定classpath
  java classpath c:\work\classes;c:\work\utiljar panyutilSample
  
  集成開發環境下的classpath設置
  
  集成開發環境中設置classpath一般通過其用戶界面進行各種集成開發環境的classpath設置各不相同我們以JBuilder為例來說明集成開發環境下的classpath
  設置Jbuilder的Library
  JBuilder中的classpath要通過類庫來設置首先選擇Tools>Configure Library然後點擊New按鈕點擊Add可以選擇要增加的類庫這個類庫可以是目錄也可以是zip格式的壓縮文件jar或者zip
  設置項目需要用到的Library
  在設置了類庫之後在JBuilder中運行一個class時並不會馬上查找你加入的類庫而是要在Project>Project Properties>Path>Required Library中設置選擇Add按鈕你就可以增加自己的classpath條目了
  
  什麼是Codebase
  
  使用Java語言編寫的程序不僅可以在本地的classpath中加載類也可以根據需要從網絡上下載類為了使Java程序可以從網絡上下載類我們需要使用codebasecodebase指定了Java程序在網絡上何處可以找到需要的類
  
  在Java Applet中使用codebase
  
  眾所周知可以在Java Applet中使用codebase指定Applet加載其所需要的類的網絡位置例如
  
  代碼
  
  
  
  
  
  
  
  這個Applet指定了其所用的類可以在服務器上Applet所在的目錄下找到
  
  在Java Application中使用codebase
  
  不僅在Applet中可以使用codebase在Application中也可以使用codebase這樣Application除了可以使用classpath中的類還可以使用網絡上的類例如
  java -classpath c:\work\classes -codebase Sample
  應用程序Sample不僅可以使用c:\work\classes中的類還可以使用中的類
  
  Classpath和codebase的關系
  
  既然Java虛擬機即可以在classpath中加載類又可以在codebase中加載類那麼classpath和codebase是什麼關系呢?實際上Classpath和codebase都是由系統類加載器(Class Loader)使用的類加載器在加載一個類的時候首先在classpath中查找需要的類然後在codebase中查找第一個被查找到的類會被加載例如在早期的JDK版本中缺省codebase是空值如果沒有在classpath中指定(當前目錄)運行當前目錄下的java class時會出現ClassNotFoundException而在晚些版本中缺省codebase是所以即使不在classpath中加入當前目錄下的java class仍然可以正常運行
  
  總結
  
  初學Java的朋友一定要掌握classpath和codebase的概念理解其內涵如果出現編譯運行程序的過程中出現什麼問題首先應該考慮是否是classpath的問題實際上甚至一些非常復雜的應用中比如服務器端應用都會因為classpath的設置而出現莫名其妙的問題如果大家在閱讀本文的過程中有什麼問題請提出來大家一起討論
  

From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19293.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.