在可执行的jar包中,Class.getResource()和ClassLoader.getResource()的行为异常。

11 浏览
0 Comments

在可执行的jar包中,Class.getResource()和ClassLoader.getResource()的行为异常。

What is the difference between Class.getResource() and ClassLoader.getResource()?和自己的代码中,我了解到以下内容:

getClass().getResource("/path/image.png")getClass().getClassLoader().getResource("path/image.png")是相同的。

Cannot read an image in jar file中,使用getClass().getClassLoader().getResource("path/image.png")在可执行的jar文件中返回null,而getClass().getResource("/path/image.png")返回正确的URL。

由于Class.getResource()会删除前导斜杠后委托给ClassLoader.getResource(),我期望这些调用是相同的,但在这种情况下显然不是这样。即使为特定类附加了特殊的类加载器,对于每个调用仍然应该是相同的,从而导致相同的行为。

因此,问题是:是否有任何明显的情况下,第一个调用返回null,而第二个调用返回正确的URL?

package com.example;
import java.net.URL;
public class ResourceTest {
   public void run() {
      URL iconUrl1 = getClass().getClassLoader().getResource("path/image.png");
      System.out.println("ClassLoader.getResource(\"path/image.png\"): " + iconUrl1);
      URL iconUrl2 = getClass().getResource("/path/image.png");
      System.out.println("Class.getResource(\"/path/image.png\"): " + iconUrl2);
   }
   public static void main(String[] args) {
      ResourceTest app = new ResourceTest();
      app.run();
   }
}

0