Я понимаю из В чем разница между Class.getResource() и ClassLoader.getResource()? и из собственного кода, что
getClass().getResource("/path/image.png")
совпадает с
getClass().getClassLoader().getResource("path/image.png")
Отправка Невозможно прочитать изображение в файле jar показывает проблему, при использовании
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();
}
}