【发布时间】:2012-10-27 11:59:03
【问题描述】:
我从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。
Since 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();
}
}
【问题讨论】:
-
您是否重现了这种行为,或者这个问题只是基于您链接的问题?尝试提供 SSCCE,然后人们将能够回答这个问题。
-
不幸的是,它只是基于我链接的那个 - 我无法重现它。如果可以的话,我肯定会发布一个 SSCCE :),我希望通过这个问题获得一些反馈,以便能够编写重现此类问题的代码。我已经使用调试器进入了 getClass().getResource(),并且看到了上面第一个链接中提到的算法,但我不知道在哪些情况下会发生链接问题中描述的行为。
-
请添加一个工作示例。我查看了 java.lang 类源和 javadoc 中的信息,但我得到的信息与您已经提到的相同。
-
@gyabraham 我添加了一个工作样本。知道如何打破它吗? (听起来像是一个奇怪的问题;))
-
问:知道如何破解它吗?答:是的。如果你想要一个“null”而不是另一个,你所要做的就是将你的“类”文件放在与“类加载器根”不同的目录中。换句话说,您所要做的就是引入一个包(无论如何您都应该这样做)。我的示例在我的机器上执行此操作:1/2 案例是“SUCCESS”,1/2 是“NULL”。我正在使用 JDK 1.6。我知道当您运行 我的相同代码 时,您会得到 all “SUCCESS” 而没有“NULL”。问:对吗?
标签: java classloader embedded-resource executable-jar