2012-12-17 42 views
4

我想讓我的應用程序類路徑。java.class.path不會帶來Manifest.mf類路徑屬性

我有一個罐子(名爲application.jar),並在其的MANIFEST.MF其他jar文件,如Class-Path: a.jar b.jar

爲什麼當我用我的System.getProperty("java.class.path")罐子a.jar文件b.jar不上市?

回答

2

它可能與「java.class.path」是從classpath環境變量($ CLASSPATH或-classpath)設置的系統屬性有關。使用-jar選項忽略這些選項。

根據java -jar文檔,當使用該jar選項運行應用程序時,僅考慮清單類路徑並忽略其他設置。 從http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html

罐子

執行封裝在JAR文件的程序。第一個參數是JAR文件的名稱,而不是啓動類名稱。爲了使這個選項起作用,JAR文件的清單必須包含一個Main-Class:classname形式的行。這裏,classname標識具有公共靜態void main(String [] args)方法的類,該方法用作應用程序的起點。有關使用Jar文件和Jar文件清單的信息,請參閱Jar工具參考頁和Java Tutorial的Jar trail。

當您使用此選項時,JAR文件是所有用戶類的來源,並且其他用戶類路徑設置將被忽略。

0

這絕對是我出現的問題。即使使用java -cp ..;myTest.jar test2.Needer,我也只能得到「..; myTest.jar」作爲java.class.path屬性的結果。

:使用-cp參數在MANIFEST.MF給定的類路徑中搜索即使! (在google上找不到這個信息並且自己測試過)

所以我認爲這與-jar參數沒有什麼關係。在Link你可以找到

擴展通配符是在類加載過程本身做到早,程序的主要方法的調用之前,而不是晚了。

有趣的是我在我的測試中發現:MANFIFEST.MF中的類路徑被遞歸搜索。因此,如果在myTest.jar的MANIFEST.MF中的類路徑中存在給定的test.jar文件,那麼test.jar的MANIFEST.MF中的類路徑也將被查找(當使用java -cp "myTest.jar" test2.Needer時)。

因此,當java.class.path屬性支持顯示MANIFEST.MF的類路徑時,它還應該顯示所有隨後依賴的.jar文件的classpathes。由於只有在找到類時才搜索類路徑,所以這不會很好地指向延遲加載機制。

TL; DR:我認爲這無關與-jar參數(-cp而言也一樣)。在我的解釋中,從MANIFEST.MF顯示類路徑的支持只會帶來額外的,無意義的遞歸搜索成本(因爲不需要實際的依賴關係,特別是從.jar中使用的)。由於這種無敏感的搜索會延遲程序開始(因爲遞歸搜索可能非常深),所以沒有實現。

相關問題