網(wǎng)站:JavaEye 作者:jvincent 發(fā)表時(shí)間: 2007-02-27 10:38 此文章來自于 http://www.JavaEye.com
          聲明:本文系JavaEye網(wǎng)站原創(chuàng)文章,未經(jīng)JavaEye網(wǎng)站或者作者本人書面許可,任何其他網(wǎng)站嚴(yán)禁擅自發(fā)表本文,否則必將追究法律責(zé)任!
          原文鏈接: http://xzgf.javaeye.com/blog/56171

          Classpath和Codebase







          概要



          Classpath和Codebase是Java中非常重要的兩個(gè)概念,初學(xué)者如果沒有掌握這兩個(gè)概念,在遇到諸如ClassNotFoundException或者相關(guān)的異常時(shí)不知所措。另外,很多其它方面的錯(cuò)誤往往也和Classpath有關(guān)。本文將詳細(xì)解釋這兩個(gè)概念,并且描述在命令行方式和集成開發(fā)環(huán)境(以JBuilder為例)中的設(shè)置方式。 



          什么是Classpath



          Classpath是Java中的重要概念,它描述了Java虛擬機(jī)在運(yùn)行一個(gè)Class時(shí)在哪些路徑中加載要運(yùn)行的類以及運(yùn)行的類要用到的類。簡單的說,就是像操作系統(tǒng)的path,只不過這個(gè)classpath是由Java的虛擬機(jī)來使用查找需要加載的類,而操作系統(tǒng)的path是由操作系統(tǒng)用來查找用戶輸入的可執(zhí)行程序。同path一樣,classpath也是一個(gè)環(huán)境變量,可以通過set命令來設(shè)置。 



          Classpath和Java包的關(guān)系



          Java的包(Package)和classpath關(guān)系密切。包是以“.”分割的,SUN建議使用域名的逆向排列來區(qū)分不同的包,以避免沖突,如com.company.util。在一個(gè)包里的類在存儲的時(shí)候需要存儲在和包名相同的目錄里,如上述com.company.util包中的Sample.class,要存儲在com\company\util目錄中。 

          Classpath有兩種表達(dá)方式,一種是指向目錄的classpath,如C:\work\classes,表示C:\work\classes目錄是一個(gè)classpath條目;另一種方式是指向壓縮文件的classpath,如C:\work\util.jar,表示C:\work\util.jar文件是一個(gè)classpath條目,任何一個(gè)包含Java類的zip格式的壓縮文件都可以作為classpath的條目。 

          那么classpath和包到底是什么關(guān)系呢?簡單的說,就是Java虛擬機(jī)在加載類的時(shí)候以這樣一種方式查找具體的類文件:classpath+包存儲的目錄+具體的類文件。如classpath中有一個(gè)c:\work\classes條目,需要加載的類是com.company.util.Sample.class,那么在加載這個(gè)類的時(shí)候,虛擬機(jī)會查找c:\work\classes\com\company\util目錄,如果Sample.class在這個(gè)目錄中,虛擬機(jī)就可以找到,如果這個(gè)類不在這個(gè)目錄中,同時(shí)也不在任何一個(gè)其它c(diǎn)lasspath中,那么虛擬機(jī)會拋出一個(gè)ClassNotFoundException。 



          Classpath的順序和類版本沖突



          Java虛擬機(jī)在加載類的時(shí)候查找classpath是有順序的,如果在classpath中有多個(gè)條目都有同一個(gè)名稱的類,那么在較前位置的類會被加載,后面的會被忽略。這種按照順序的類加載可能會導(dǎo)致類的版本沖突。例如classpath=c:\servlet2.2\servlet.jar;c:\servlet2.3\servlet.jar,那么在實(shí)際應(yīng)用的過程中,你使用的是servlet2.2,而不是servlet2.3。很多時(shí)候如果不注意這一點(diǎn),可能會導(dǎo)致奇怪的異常。 



          命令行狀態(tài)下的classpath設(shè)置



          命令行狀態(tài)下的classpath可以通過兩種方式設(shè)置。 

          一種是直接設(shè)置環(huán)境變量,例如在windows環(huán)境下,我們使用set命令: 

          set classpath=c:\work\classes;c:\work\util.jar 

          另一種方式是在執(zhí)行javac、java或者其它Java命令時(shí)直接指定classpath: 

          java -classpath c:\work\classes;c:\work\util.jar com.company.util.Sample 



          集成開發(fā)環(huán)境下的classpath設(shè)置



          集成開發(fā)環(huán)境中設(shè)置classpath一般通過其用戶界面進(jìn)行,各種集成開發(fā)環(huán)境的classpath設(shè)置各不相同,我們以JBuilder為例來說明集成開發(fā)環(huán)境下的classpath。 

          1.設(shè)置Jbuilder的Library 

          JBuilder中的classpath要通過類庫來設(shè)置,首先選擇Tools->;Configure Library,然后點(diǎn)擊New按鈕,點(diǎn)擊Add...,可以選擇要增加的類庫,這個(gè)類庫可以是目錄,也可以是zip格式的壓縮文件,如.jar或者.zip。 

          2.設(shè)置項(xiàng)目需要用到的Library 

          在設(shè)置了類庫之后,在JBuilder中運(yùn)行一個(gè)class時(shí)并不會馬上查找你加入的類庫,而是要在Project->;Project Properties->;Path->;Required Library中設(shè)置,選擇Add...按鈕,你就可以增加自己的classpath條目了。 



          什么是Codebase



          使用Java語言編寫的程序,不僅可以在本地的classpath中加載類,也可以根據(jù)需要從網(wǎng)絡(luò)上下載類。為了使Java程序可以從網(wǎng)絡(luò)上下載類,我們需要使用codebase,codebase指定了Java程序在網(wǎng)絡(luò)上何處可以找到需要的類。 



          在Java Applet中使用codebase



          眾所周知,可以在Java Applet中使用codebase指定Applet加載其所需要的類的網(wǎng)絡(luò)位置.



          這個(gè)Applet指定了其所用的類可以在服務(wù)器上Applet所在的目錄下找到。 



          在Java Application中使用codebase



          不僅在Applet中可以使用codebase,在Application中也可以使用codebase。這樣Application除了可以使用classpath中的類,還可以使用網(wǎng)絡(luò)上的類。例如: 

          java -classpath c:\work\classes -codebase http://www.company.com/classes Sample 

          應(yīng)用程序Sample不僅可以使用c:\work\classes中的類,還可以使用http://www.company.com/classes中的類。 



          Classpath和codebase的關(guān)系



          既然Java虛擬機(jī)即可以在classpath中加載類,又可以在codebase中加載類,那么classpath和codebase是什么關(guān)系呢?實(shí)際上,Classpath和codebase都是由系統(tǒng)類加載器(Class Loader)使用的。類加載器在加載一個(gè)類的時(shí)候,首先在classpath中查找需要的類,然后在codebase中查找,第一個(gè)被查找到的類會被加載。例如,在早期的JDK版本中,缺省codebase是空值,如果沒有在classpath中指定“.”(當(dāng)前目錄),運(yùn)行當(dāng)前目錄下的java class時(shí)會出現(xiàn)ClassNotFoundException;而在晚些版本中,缺省codebase是“.”,所以即使不在classpath中加入“.”,當(dāng)前目錄下的java class仍然可以正常運(yùn)行。 



          總結(jié)



          初學(xué)Java的朋友一定要掌握classpath和codebase的概念,理解其內(nèi)涵,如果出現(xiàn)編譯、運(yùn)行程序的過程中出現(xiàn)什么問題,首先應(yīng)該考慮是否是classpath的問題。實(shí)際上,甚至一些非常復(fù)雜的應(yīng)用中,比如服務(wù)器端應(yīng)用,都會因?yàn)閏lasspath的設(shè)置而出現(xiàn)莫名其妙的問題。如果大家在閱讀本文的過程中有什么問題,請?zhí)岢鰜泶蠹乙黄鹩懻摗?/p>

           




          《 (轉(zhuǎn)貼)Classpath和Codebase 》 的評論也很精彩,歡迎您也添加評論。查看詳細(xì) >>





          JavaEye推薦
          廣州:夢境網(wǎng)絡(luò)公司:薪水+期權(quán)誠聘高級人才 C++工程師 和 Java工程師
          北京:高薪誠聘Ruby on Rails高手: 月薪15-25K
          上海:尤恩斯國際集團(tuán):誠聘開發(fā)工程師
          北京:優(yōu)秀公司NHNChina招聘:WEB開發(fā),系統(tǒng)管理,JAVA開發(fā), DBA



          文章來源: http://xzgf.javaeye.com/blog/56171

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 资中县| 海兴县| 贵溪市| 昌宁县| 莱阳市| 常熟市| 临高县| 彰武县| 井研县| 香格里拉县| 原阳县| 遵义县| 陆川县| 南丹县| 桂平市| 新密市| 清流县| 临江市| 张北县| 灵石县| 金华市| 秦安县| 高雄市| 英德市| 饶平县| 鹿泉市| 澄迈县| 宁安市| 綦江县| 河北区| 绥宁县| 观塘区| 从化市| 定边县| 双城市| 永定县| 万安县| 阆中市| 纳雍县| 丽江市| 吴堡县|