簡體   English   中英

為什么我可以從JAR而不是資源中加載類?

[英]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.jarbar-service.jarMETA-INF/services/....包含服務定義。

當我從Maven單元測試調用java.util.ServiceLoader ,它可以同時看到foobar服務。 當我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-Pathsun.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM