資源描述:
《使用java擴(kuò)展機(jī)制加載所有jar包-java開發(fā)java經(jīng)驗(yàn)技巧》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、使用Java擴(kuò)展機(jī)制加載所冇JAR包-編程開發(fā)技術(shù)使用Java擴(kuò)展機(jī)制加載所有JAR包木文由ImportNew?孟冰川翻譯自marxsoftwarc。歡迎加入翻譯小組。轉(zhuǎn)載請見文末要求。Java擴(kuò)展機(jī)制在Java教程中被描述為一種“通過標(biāo)準(zhǔn)可擴(kuò)展的方式來讓Jeivei平臺上所冇應(yīng)用使用自定義API”。正如在理解擴(kuò)展機(jī)制進(jìn)行類加載屮描述的,“擴(kuò)展框架充分使用了類加載代理機(jī)制”。這種機(jī)制會在rt.jar引導(dǎo)(boot)類加載之后,標(biāo)準(zhǔn)classpath的類加載之前,加載擴(kuò)展類。擴(kuò)展目錄的工作機(jī)制在類的加載上與classpat
2、h有點(diǎn)類似。對Java應(yīng)用程序來說,所有擴(kuò)展口錄下JAR文件包含的類都可以訪問。然而,會有-?些關(guān)鍵的不同點(diǎn)。這些區(qū)別會在下面的文字中高亮顯示。特征Classpath擴(kuò)展機(jī)制(可選包)作用域典型的應(yīng)用相關(guān)?-classpath/-cp?java.class.path?可執(zhí)行JARManifest的Class-Path主機(jī)上所有可能的JRE?CLASSPATH環(huán)境變量所有運(yùn)行在特定JRE上的JVM?java.ext.dirs各種主機(jī)上的JRE?Solaris:/usr/jdk/packages/1ib/ext?Linux:
3、/usr/java/packages/lib/ext?Windows:%SystcmRoot%SunJavalibcxt如何指定?jar文件?明確的通過名字來指定(包括?jar)?使用通配符來匹配所有的.j竝擴(kuò)展.classFiles?指定冃錄下的.class文件所有在指定目錄卞的JAR文件都會被加載(即使擴(kuò)展名不是.jar或者沒有擴(kuò)展名)類加載順序引導(dǎo)和擴(kuò)展類加載之后引導(dǎo)類加載之后,classpath上的類加載之前一個(gè)最重要且值得重視的問題是,擴(kuò)展機(jī)制會找出所有jar格式的文件,即使文件后綴名不是.jar。這意
4、味著,改變classpath中的jar文件后綴名以此逃過通配符的篩選,這種方法在擴(kuò)展目錄中行不通。我會用一些簡單的例子來展示一些上而提到的區(qū)別。接下來的兩段代碼是一個(gè)簡單的HelloWorld類和一個(gè)main應(yīng)用程序中的Main類。Main通過調(diào)用main方法來使用HelloWorld類。HelloWorld?javapublicclassHelloWorld{?OverridepublicStringtoStringO{return"Hello,World!;}}Main?javaimportstaticjava.la
5、ng.System.out;publicclassMain{publicstaticvoidmain(finalString[]arguments){out.println(newHelloWorld());}為了展示classpath和擴(kuò)展機(jī)制的主要區(qū)別,我將會把編譯過的HelloWorld.class文件歸檔到一個(gè)jar包里,命名為HelloWorld.jar0并把它放在一個(gè)跟編譯過的Main,class不同的口錄下。為了展示傳統(tǒng)的classpath的使用,我把HelloWorld.jar放在一個(gè)叫做C:hello
6、的目錄下并口會用通配符訪問JAR來給Main使用。下面的兩個(gè)截圖對此進(jìn)行了展示。以上兩個(gè)截圖說明,盡管我刪掉了當(dāng)前目錄下的HelloWorld.class,Java主應(yīng)用仍然能加載它。這是因?yàn)镴avalauncher被告知(通過-classpath這個(gè)可選參數(shù))去C:hello目錄下尋找。使用擴(kuò)展機(jī)制,不需要把類放到當(dāng)前目錄或者指定到classpathF就可以加載。接下來的截圖展示了這一點(diǎn)。上面的截圖說明,當(dāng)某個(gè)類是在擴(kuò)展戸錄下的某個(gè)JAR里,Javalauncher其至不需要把HelloWorld.class放到同一
7、個(gè)目錄卜或者在classpath中指定。這常常被用來說明使用擴(kuò)展機(jī)制的優(yōu)點(diǎn)。因?yàn)樗鶅釉谶@個(gè)JRE(或者可能是主機(jī)上的所冇應(yīng)用)上運(yùn)行的程序都可以不用在classpath上指定就能看到擴(kuò)展目錄下的類。使用傳統(tǒng)classpath方式指導(dǎo)應(yīng)用去加載JAR中的類,包含.class文件的JAR文件必須以.jar結(jié)尾。接下來的截圖展示了當(dāng)把在classpath引用的目錄下的HelleWorld,jar重命名為HclloWorld.backupZ后所發(fā)生的事情。上面這張圖展示了當(dāng)classpath引用的目錄下JAR文件沒有以.jar結(jié)
8、尾時(shí)發(fā)生的NoClassDefFoundError異常??赡苡悬c(diǎn)令人驚訝,擴(kuò)展機(jī)制不是這樣工作的。所冇在擴(kuò)展目錄下的JAR文件,不管后綴名是什么甚至沒冇后綴名都會被加載。接下來的截圖展示了這一點(diǎn)。這張圖展示了,給在擴(kuò)展目錄中的JAR文件重命名為沒有后綴的文件并不妨礙類加載器加載JAR文件中的類。換句話說,類加載機(jī)制是