我想讓我的應用程序類路徑。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不上市?
我想讓我的應用程序類路徑。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不上市?
它可能與「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文件是所有用戶類的來源,並且其他用戶類路徑設置將被忽略。
這絕對是我出現的問題。即使使用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中使用的)。由於這種無敏感的搜索會延遲程序開始(因爲遞歸搜索可能非常深),所以沒有實現。