




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大型游樂設(shè)施租賃合同樣本
- 商業(yè)綜合體地簧門改造合同
- 國內(nèi)海運(yùn)貨物保險(xiǎn)合同樣本
- 擔(dān)架使用培訓(xùn)課件
- 壓力容器安全管理考核試卷
- 動物用藥品店面的環(huán)境設(shè)計(jì)與氛圍營造考核試卷
- 有機(jī)合成原料在綠色涂料技術(shù)的創(chuàng)新考核試卷
- 木材產(chǎn)品環(huán)保性能提升考核試卷
- 整流器在數(shù)據(jù)中心能源效率優(yōu)化考核試卷
- 智慧城市和自然資源的合理利用考核試卷
- 課件《中國式現(xiàn)代化》
- 公共事業(yè)管理案例
- 建筑電工考試題庫與答案
- TCSES 71-2022 二氧化碳地質(zhì)利用與封存項(xiàng)目泄漏風(fēng)險(xiǎn)評價(jià)規(guī)范
- 國際貨運(yùn)代理英語(貨代英語)forwarder-English-1-to-21
- 光伏電站小EPC合同模版
- 電池材料簡介ppt
- GB/T 4745-2012紡織品防水性能的檢測和評價(jià)沾水法
- 馬工程教材《公共財(cái)政概論》PPT-緒論
- GB/T 26752-2020聚丙烯腈基碳纖維
- 十一種正方體展開平面圖(僅打?。?/a>
評論
0/150
提交評論