在可执行的jar包中,Class.getResource()和ClassLoader.getResource()的行为异常。
在可执行的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(); } }