JAVA類路徑說明(新手必讀)_第1頁
JAVA類路徑說明(新手必讀)_第2頁
JAVA類路徑說明(新手必讀)_第3頁
JAVA類路徑說明(新手必讀)_第4頁
JAVA類路徑說明(新手必讀)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、一、類路徑   (class path 為什么呢?編譯好的class明明在呀。我們一起來看一看java程序的運(yùn)行過程。我們已經(jīng)知道java是通過java虛擬機(jī)來解釋運(yùn)行的,也就是通過java命令javac編譯生成的.class文件就是虛擬機(jī)要執(zhí)行的代碼, 稱之為字節(jié)碼(bytecode,虛擬機(jī)通過classloader來裝載這些字節(jié)碼,也就是通常意義上的類。這里就有一個問題,classloader從哪里知道java本身的類庫及用戶自己的類在什么地方呢?或者有著缺省值(當(dāng)前路徑 ,或者要有一個用戶指定的變量來表明,這個變量就是類路徑(classpath,或者在運(yùn)行的時(shí)候傳參數(shù)給虛擬機(jī)。

2、這也就是指明classpath的三個方法。編譯的過程和運(yùn)行的過程大同小異,只是一個是找出來編譯,另一個是找出來裝載。實(shí)際上java虛擬機(jī)是由java luncher初始化的,也就是java (或java.exe 這個程序來做的。虛擬機(jī)按以下順序搜索并裝載所有需要的類: 2、擴(kuò)展類:使用java擴(kuò)展機(jī)制的類,都是位于擴(kuò)展目錄($JAVA_HOME/jre/lib/ext 中的.jar檔案包。3、用戶類:開發(fā)者定義的類或者沒有使用java擴(kuò)展機(jī)制的第三方產(chǎn)品。你必須在命令行中使用-classpath選項(xiàng)或者使用CLASSPATH環(huán)境變量來確定這些類的位置。我們在上面所說的用戶自己的類就是特指這些類

3、。這樣,一般來說,用戶只需指定用戶類的位置,引導(dǎo)類和擴(kuò)展類是“自動”尋找的。那么到底該怎么做呢?用戶類路徑就是一些包含類文件的目錄,.jar, .zip文件的列表,至于類具體怎么找,因?yàn)闋砍兜絧ackage的問題,下面將會說到,暫時(shí)可認(rèn)為只要包含了這個類就算找到了這個類。根據(jù)平臺的不同分隔符略有不同,類unix的系統(tǒng)基本上都是“:”,windows多是“;”。其可能的來源是: *   “. ”, 即當(dāng)前目錄,這個是缺省值。*   CLASSPATH環(huán)境變量,一旦設(shè)置,將缺省值覆蓋。*   命令行參數(shù)-cp或者-classpath,一旦指定,將上兩者覆蓋。* 

4、60; 由-jar參數(shù)指定的.jar檔案包,就把所有其他的值覆蓋,所有的類都來自這個指定的檔案包中。由于生成可執(zhí)行的.jar文件,還需要其他一些知識,比如package,還有特定的配置文件,本文的最后會提到??上瓤纯磈dk自帶的一些例子。我們舉個HelloWorld的例子來說明。先做以下假設(shè): *   當(dāng)前目錄是/HelloWorld(或c:HelloWorld, 以后都使用前一個*   PATH環(huán)境變量設(shè)置正確。(這樣可以在任何目錄下都可以使用工具*   文件是HelloWorld.java,內(nèi)容是:    public   cla

5、ss   HelloWorld    public   static   void   main(String   argsSystem.exit(0; 首先這個文件一定要寫對,如果對c熟悉的話,很有可能寫成這樣:public   static   void   main(int   argc,String   argv . 這樣是不對的,不信可以試一試。由于手頭沒有java的規(guī)范,所以作如下猜想: java的application程序,必須以public   st

6、atic   void   main(String開始,其他不一樣的都不行。到現(xiàn)在為止,我們設(shè)置方面只設(shè)置了PATH。1、當(dāng)前路徑就是指你的.class文件在當(dāng)前目錄下,HelloWorld$   javac   HelloWorld.java     /這一步不會有多大問題,HelloWorld$   java   HelloWorld            /   這一步可能就會有問題.。如果出了象開頭那樣的問題,首先確定不是由于敲錯命令而出

7、錯。如果沒有敲錯命令,那么接著做:HelloWorld$   echo   $CLASSPATH或者 c:HelloWorld> echo   %CLASSPATH%看看CLASSPATH環(huán)境變量是否設(shè)置了, 如果設(shè)置了,那么用以下命令: HelloWorld$   CLASSPATH=或者 c:HelloWorld>   set   CLASSPATH=來使它為空,然后重新運(yùn)行。這次用戶類路徑缺省的是". ",所以應(yīng)該不會有相同的問題了。還有一個方法就是把". "加入到 CLASS

8、PATH中。/$   CLASSPATH=$CLASSPATH:.或者 c:HelloWorld>   set   CLASSPATH=%CLASSPATH%; 同樣也可以成功.   Good   Luck。2、 當(dāng)你的程序需要第三方的類庫支持,而且比較常用,就可以采用此種方法。比如常用的數(shù)據(jù)庫驅(qū)動程序,寫servlet需要的servlet包等等。設(shè)置方法就是在環(huán)境變量中加入CLASSPATH。然后就可以直接編譯運(yùn)行了。還是以HelloWorld為例,比如你想在根目錄中運(yùn)行它,那么你直接在根目錄下執(zhí)行 $   java

9、   HelloWorld或者 c:> java   HelloWorld 這樣肯定會出錯,如果你的CLASSPATH沒有改動的話.。我想大家應(yīng)該知道為什么錯了吧,那么怎么改呢?前面說過,用戶類路徑就是一些包含你所需要的類的目錄,.jar檔案包,.zip包。現(xiàn)在沒有生成包,所以只好把HelloWorld.class所在的目錄加到CLASSPATH了,根據(jù)前面的做法,再運(yùn)行一次,看看,呵呵,成功了,換個路徑,又成功了!不僅僅以直接運(yùn)行其中的類,當(dāng)你要import其中的某些類時(shí),同樣處理。不知道你想到?jīng)]有,隨著你的系統(tǒng)的不斷的擴(kuò)充,(當(dāng)然了,都是一些需要java的東西。

10、如果都加到這個環(huán)境變量里,那這個變量會越來越臃腫,雖然環(huán)境變量空間可以開很大,總 覺得有些不舒服??纯聪旅嬉粋€方法。3、在命令行參數(shù)中指明classpath。還是和上面相同的目標(biāo),在任何目錄下執(zhí)行HelloWorld,用這個方法怎么實(shí)現(xiàn)呢? /$   java   -cp   /HelloWorld   HelloWorld或者 c:> java   -cp   c:HelloWorld   HelloWorld就可以了。這是這種方法的最簡單的應(yīng)用了。當(dāng)你使用了另外的包的時(shí)候,還可以采用用這種方法。例如:$  

11、; javac   -classpath   aPath/aPackage.jar:.   myJava.java $   java     -cp   aPath/aPackage.jar:.   myJava 或者 c:>   javac   -classpath   aPathaPackage.jar;.   myJava.java c:>   java     -cp   aPathaPackage.jar;. &#

12、160; myJava 這種方法也有一個不方便的的地方就是當(dāng)?shù)谌桨诘穆窂捷^長或者需要兩個以上包包的時(shí)候,每次編譯運(yùn)行都要寫很長,非常不方便,這時(shí)候可以寫腳本來解決。 比如一個例子:compile  (文件,權(quán)限改為可執(zhí)行,當(dāng)前目錄)            $   cat   compile -#!/bin/bashjavac   -classpath   aPathaPackage.jar:anotherPathanotherPackage.jar:. myJavva.java

13、-run   (文件,權(quán)限改為可執(zhí)行,當(dāng)前目錄 $cat   run - #!/bin/bash java   -cp   aPathaPackage.jar:anotherPathanotherPackage.jar:.   myJava -或者: compile.batc:HelloWorld>   type   compile.bat - javac   -classpath   aPathaPackage.jar:anotherPathanotherPackage.jar:.  

14、myJavva.java -run.batc:HelloWorld>   type   run.bat-java   -cp   aPathaPackage.jar:anotherPathanotherPackage.jar:.   myJava- 就可以了。試試看。前面提到了擴(kuò)展類,擴(kuò)展類是什么呢?java的擴(kuò)展類就是應(yīng)用程序開發(fā)者用來擴(kuò)展核心平臺功能的java類的包(或者是   native   code)。虛擬機(jī)能像使用系統(tǒng)類一樣使用這些擴(kuò)展類。有人建議可以把包放入擴(kuò)展目錄里,這樣,CLASSPATH也不用設(shè)了,

15、也不用指定了,豈不是很方便?確實(shí)可以正確運(yùn)行,但是個人認(rèn)為這樣不好,不能什么東西都往里擱,一些標(biāo)準(zhǔn)的擴(kuò)展包可以,比如,JavaServlet,Java3D等等。可以提個建議,加一個環(huán)境變量,比如叫JARPATH,指定一個目錄,專門存放用戶的jar 、zip等包,這個要等SUN公司來做了。windows98下,我原來安裝的時(shí)候,一直裝不上,總是死機(jī),好不容易裝上了,缺省的是不能運(yùn)行正確的,然后把   tool.jar   放入   CLASSPATH   后工作正?!,F(xiàn)在作測試,去掉仍然是正確的。經(jīng)過多次測試,發(fā)現(xiàn)如果原來曾裝過jdk的都很好,沒有裝過的裝

16、的時(shí)候會死機(jī),多裝幾次就可以了。如果你發(fā)現(xiàn)正確安裝后,不能正常工作,就把tools.jar加入CLASSPATH,試一下。二、包 (packageJava中的“包”是一個比較重要的概念,package是這樣定義的: Definition: A package is   a   collection   of   related   classes   and   interfaces that provides access   protection   and   namespace 

17、0; management。也就是: 一個包就是一些提供訪問保護(hù)和命名空間管理的相關(guān)類與接口的集合。使用包的目的就是使類容易查找使用,防止命名沖突,以及控制訪問。這里我們不討論關(guān)于包的過多的東西,只討論和編譯,運(yùn)行,類路徑相關(guān)的東西。至于包的其他內(nèi)容,請自己查閱相關(guān)文檔。簡單一點(diǎn)來說,包就是一個目錄,下面的子包就是子目錄,這個包里的類就是這個目錄下的文件。我們用一個例子來說明。首先建目錄結(jié)構(gòu)如下: PackageTest/source/,以后根目錄指的是PackageTest目錄,我們的源程序放在source目錄下。源程序如下:PackageTest.java package   p

18、ktest;public   class   PackageTest private   String   value;public   PackageTest(String   s value   =   s;public   void   printValue( public   static   void   main(String   args PackageTest   test   =   new   P

19、ackageTest( "This   is   a   Test   Package " test.printValue(;PackageSecond   second   =   new   PackageSecond( "I   am   in   PackageTest " second.printValue(;PackageSub   sub   =   new   PackageSub( &qu

20、ot;I   am   in   PackageTest " sub.printValue(;System.exit(0;         PackageSecond.java package   pktest; public   class   PackageSecond private   String   value;public   PackageSecond(String   s value   =   s; pub

21、lic   void   printValue( PackageSub.java package   pktest.subpk;import   pktest.*;public   class   PackageSub private   String   value;public   PackageSub(String   s value   =   s; public   void   printValue( PackageSecond  

22、second   =   new   PackageSecond( "I   am   in   subpackage. " second.printValue(; Main.java import   pktest.*; public   class   Main( public   static   void   main( PackageSecond   second   =   new   PackageSe

23、cond( "I   am   in   Main " second.printValue(;PackageSub   sub   =   new   PackageSub( "I   am   in   Main " sub.printValue(;System.exit(0; 其中,Main.java 是包之外的一個程序,用來測試包外的程序訪問包內(nèi)的類, PackageTest.java 屬于 pktest 這個包,也是主程序. PackageSeco

24、nd.java 也屬于 pktest,PackageSub 屬于 pktest 下的 subpk 包,也就是 pktest.subpk。詳細(xì)使用情況,請參看源程序。好了,先把源程序都放在 source 目錄下,使 source 成為當(dāng)前目錄,然后編譯一下,呵呵,出錯了,Main.java:1: Package pktest not found in import. import pktest.*; 這里涉及到類路徑中包是怎么查找的,前面我們做了一點(diǎn)假設(shè): "只要包含了這個類就算找到了這個類 ",現(xiàn)在就有問題了。其實(shí)jdk的工具javac 、java 、javadoc都需要查

25、找類,看見目錄,就認(rèn)為是包的名字,對于 import 語句來說,一個包對應(yīng)一個目錄。這個例子中,import pktest.*,我們知道類路徑可以包含一個目錄,那么就以那個目錄為根,比如有個目錄 /myclass,那么就會在查找/myclass/pktest 目錄及其下的類. 所有的都找遍,如果沒有就會報(bào)錯。由于現(xiàn)在的類路徑只有當(dāng)前目錄,而當(dāng)前目錄下沒有 pktest 目錄,所以就會出錯。類路徑還可以包含 .jar .zip文件,這些就是可以帶目錄的壓縮包,可以把 .jar .zip文件看做一個虛擬的目錄,然后就和目錄一樣對待了。好了,應(yīng)該知道怎么做了吧,修改后的目錄結(jié)構(gòu)如下: Package

26、Test | |_source  Main.java | |_pktest  PackageTest.java  PackageSecond.java| |_subpk  PackageSub.java然后重新編譯,運(yùn)行,哈哈,通過了。我們再來運(yùn)行一下PackageTest。source$   java   pktest/PackageTest怎么又出錯了?是這樣的,java所要運(yùn)行的是一個類的名字,它可不管你的類在什么地方,就象我們前面所討論的一樣來查找這個類,所以它把pktest/PackageTest看成是一個類的名字了,當(dāng)然會

27、出錯了,應(yīng)該這么做,source$   java   pktest.PackageTest大家應(yīng)該明白道理吧,我就不多說了。注意javac不一樣,是可以指明源文件路徑的,javac只編譯,不運(yùn)行,查找類也只有在源文件中碰到import時(shí)才會做,與源文件所在的包沒有關(guān)系。似乎還又些不好的地方,怎么生成的   .class   文件這么分散呀,看著真別扭。別急,javac有一個 -d 命令行參數(shù),可以指定一個目錄,把生成的 .class 文件按照包給你好好地?cái)R在這個目錄里面.         source$

28、  mkdir   classes         source$   javac   -d   classes   pktest/PackageTest.java         source$   javac   -d   classes   Main.java 那么運(yùn)行怎么運(yùn)行呢?         source$   cd   classes 

29、0;       classes$   java   pktest.PackageTest         classes$   java   Main 就可以了。其實(shí)jdk的這一套工具小巧簡單,功能強(qiáng)大,不會用或者用錯其實(shí)不關(guān)工具的事,關(guān)鍵是明白工具背后的一些原理和必要的知識。集成環(huán)境是很好,但是它屏蔽了很多底層的知識,不出錯還好,一旦出錯,如果沒有這些必要的知識就很難辦,只好上bbs問,別人只告訴了你解決的具體方法,下一次遇到稍微變化一點(diǎn)的問題又不懂了。所以不要拘泥于工具,java

30、   的這一套工具組合起來使用,中小型工程(五六十個類,還是應(yīng)付得下來的。三、jar文件1、從前面我們可以看出來jar文件在java中非常重要,極大地方便了用戶的使用。我們也可以做自己的.jar包。2、還是使用前面那個例子,Main.java是包之外的東西,用了pktest包中的類,我們現(xiàn)在就是要把pktest做成一個.jar包,很簡單,剛才我們已經(jīng)把pktest中的.class都集中起來了,classes$   jar   -cvf   mypackage.jar   pktest 就會生成mypackage.jar文件,測試一下,剛才我們生

31、成的Main.class就在classes目錄下,所以,從前面可以知道: classes$   java   -cp   mypackage.jar:.   Main就可以運(yùn)行了。3、如果你看過jdk所帶的例子,你就會知道,.jar還可以直接運(yùn)行,/demo$   java   -jar   aJar.jar那好,就那我們的試一試,classes$   java   -jar   mypackage.jarFailed   to   load   Main-Clas

32、s   manifest   attribute   from mypackage.jar 看來我們的jar和它的jar還不一樣,有什么不一樣呢?拿它一個例子出來,重新編譯,生成.jar文件,比較后發(fā)現(xiàn),是.jar壓縮包中META-INF/MANIFEST.MF文件不一樣,多了一行,Main-Class: xxxxx,再看看出錯信息,原來是沒有指定Main-Class,看看jar命令,發(fā)現(xiàn)有一個參數(shù)-m,-m     include   manifest   information   from   sp

33、ecified   manifest   file和出錯信息有點(diǎn)關(guān)系,看來它要讀一個配制文件.   只好照貓畫虎寫一個了。classes$   cat   myManifest Manifest-Version:   1.0Main-Class:   pktest.PackageTest classes$   jar   cvfm   mypackage.jar   myManifest   pktest added   manifestadding:  

34、 pktest/(in   =   0   (out=   0(stored   0%adding:   pktest/PackageSecond.class(in   =   659   (out=   395(deflated   40% adding:   pktest/subpk/(in   =   0   (out=   0(stored   0% adding:   pktest/subpk/Packag

35、eSub.class(in   =   744   (out=   454(deflated   38% adding:   pktest/PackageTest.class(in   =   1041   (out=   602(deflated   42% classes$   java   -jar   mypackage.jar Value   of   PackageTest   is   This 

36、60; is   a   Test   PackageValue   of   PackageSecond   is   I   am   in   PackageTest Value   of   PackageSecond   is   I   am   in   subpackage. Value   of   PackageSub   is   I   am   in   PackageTest好了,成功了,這樣就做好了一個可以直接執(zhí)行的.jar文件。大家可以自己試一試 做一個

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論