![](/img/trans.png)
[英]How can I load an xml resource file from within an executible Jar file and save it to the folder the jar is located in?
[英]Why can I load a class from a JAR but not a resource?
我正在使用僅包含ClassPath
元素的JAR來構建Java應用程序的類路徑,並且遇到了奇怪的行為:我可以從ClassPath
元素中提到的JAR中加載類,但是缺少某些(或全部)資源。
示例:我的full-classpath.jar
僅包含一個META-INF/MANIFEST.MF
具有通常的內容和以下內容:
ClassPath: foo-service.jar bar-service.jar service-main.jar
service-main.jar
包含com.pany.project.Main
。
當我運行java -cp full-classpath.jar com.pany.project.Main
,該方法有效。
但是foo-service.jar
和bar-service.jar
在META-INF/services/....
包含服務定義。
當我從Maven單元測試調用java.util.ServiceLoader
,它可以同時看到foo
和bar
服務。 當我java -cp full-classpath.jar com.pany.project.Main -service foo
,我在日志中看到一個空的服務列表。
更糟糕的是,當我調用Main.class.getClassLoader().getResources("META-INF/MANIFEST.MF")
,我僅從full-classpath.jar
獲得清單。 其他三個JAR文件中的清單文件丟失了,這沒有意義,因為我可以從這些JAR文件中加載類! 當我手動構建整個類路徑時,它也可以工作。 僅當我在full-classpath.jar
使用ClassPath
元素時,它才會失敗。
任何想法可能是錯誤的,或者我該如何調試?
我正在使用Java 8。
清單屬性Class-Path
在sun.misc.URLClassPath.JarLoader.parseClassPath(URL, String)
。 從sun.misc.URLClassPath.JarLoader.getClassPath()
一次調用此方法。 在getClassPath()
的開頭,您可以找到以下代碼:
if (index != null) {
return null;
}
if (metaIndex != null) {
return null;
}
這意味着:如果您的類路徑JAR包含索引或“元索引”(無論是什么),則將忽略Class-Path
屬性。
我不知道為什么Java仍然可以從Class-Path
屬性中提到的JAR加載類,但是刪除索引可以解決資源加載問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.