簡體   English   中英

getClassLoader().getResourceAsStream() 在模塊化 java 項目(openjdk 11)中不起作用?

[英]getClassLoader().getResourceAsStream() not work in modular java project (openjdk 11)?

這是一個maven 項目,在資源目錄中有一個圖像:

├─ src
   ├─ main
       ├─ java
       └─ resources  
          └─imgs
            └─logo.png

代碼:

public class Test {
    public static void main(String[] args) {
        InputStream stream = Test.class.getClassLoader().getResourceAsStream("/imgs/logo.png");
        InputStream stream1 = Test.class.getClassLoader().getResourceAsStream("imgs/logo.png");
        System.out.println(stream == null ? "stream is null!" : "stream is not null!");
        System.out.println(stream1 == null ? "stream1 is null!" : "stream1 is not null!");
    }
}

當我module-info.java添加到項目中時,將打印:

stream is null!
stream1 is null!

但是當我從項目中刪除module-info.java時,將打印:

stream is null!
stream1 is not null!

為什么? 以及如何使用ClassLoader在模塊化 java 項目中加載資源?

資源應該通過Test.class加載,而不是它的 ClassLoader。 通過在 class 上加載資源,您可以為資源所在的位置建立上下文(JAR、模塊、依賴項)。

對於同一 package 中的資源,請使用相對路徑:

Test.class.getResource("logo.png")

如果 Test 的限定名稱是org.foo.Test ,它將在 JAR 中(或在構建 JAR 之前的資源文件夾中)的org/foo/logo.png中查找資源。

對於同一模塊中的資源,請使用以斜杠開頭的絕對路徑:

Test.class.getResource("/logo.png")

^ 這是您大部分時間想要使用的。

不需要 go 超過 classloader 當開發人員不知道如何正確尋址資源並使用相對路徑通過類加載器加載資源時,我經常看到這種情況,這在大多數情況下都可以正常工作,但對於 Java9 和 OSGI 等模塊化項目/類加載器來說並不是很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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