概要
Classpath和Codebase是Java中非常重要的兩個概念
初學者如果沒有掌握這兩個概念
在遇到諸如ClassNotFoundException或者相關的異常時不知所措
另外
很多其它方面的錯誤往往也和Classpath有關
本文將詳細解釋這兩個概念
並且描述在命令行方式和集成開發環境(以JBuilder為例)中的設置方式
什麼是Classpath
Classpath是Java中的重要概念
它描述了Java虛擬機在運行一個Class時在哪些路徑中加載要運行的類以及運行的類要用到的類
簡單的說
就是像操作系統的path
只不過這個classpath是由Java的虛擬機來使用查找需要加載的類
而操作系統的path是由操作系統用來查找用戶輸入的可執行程序
同path一樣
classpath也是一個環境變量
可以通過set命令來設置
Classpath和Java包的關系
Java的包(Package)和classpath關系密切
包是以
分割的
SUN建議使用域名的逆向排列來區分不同的包
以避免沖突
如pany
util
在一個包裡的類在存儲的時候需要存儲在和包名相同的目錄裡
如上述pany
util包中的Sample
class
要存儲在com\company\util目錄中
Classpath有兩種表達方式
一種是指向目錄的classpath
如C:\work\classes
表示C:\work\classes目錄是一個classpath條目
另一種方式是指向壓縮文件的classpath
如C:\work\util
jar
表示C:\work\util
jar文件是一個classpath條目
任何一個包含Java類的zip格式的壓縮文件都可以作為classpath的條目
那麼classpath和包到底是什麼關系呢?簡單的說
就是Java虛擬機在加載類的時候以這樣一種方式查找具體的類文件
classpath+包存儲的目錄+具體的類文件
如classpath中有一個c:\work\classes條目
需要加載的類是pany
util
Sample
class
那麼在加載這個類的時候
虛擬機會查找c:\work\classes\com\company\util目錄
如果Sample
class在這個目錄中
虛擬機就可以找到
如果這個類不在這個目錄中
同時也不在任何一個其它classpath中
那麼虛擬機會拋出一個ClassNotFoundException
Classpath的順序和類版本沖突
Java虛擬機在加載類的時候查找classpath是有順序的
如果在classpath中有多個條目都有同一個名稱的類
那麼在較前位置的類會被加載
後面的會被忽略
這種按照順序的類加載可能會導致類的版本沖突
例如classpath=c:\servlet
\servlet
jar
c:\servlet
\servlet
jar
那麼在實際應用的過程中
你使用的是servlet
而不是servlet
很多時候如果不注意這一點
可能會導致奇怪的異常
命令行狀態下的classpath設置
命令行狀態下的classpath可以通過兩種方式設置
一種是直接設置環境變量
例如在windows環境下
我們使用set命令
set classpath=c:\work\classes
c:\work\util
jar
另一種方式是在執行javac
java或者其它Java命令時直接指定classpath
java
classpath c:\work\classes;c:\work\util
jar pany
util
Sample
集成開發環境下的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程序可以從網絡上下載類
我們需要使用codebase
codebase指定了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