리소스를로드 할 때 다음의 차이점을 확인하십시오.
getClass().getClassLoader().getResource("com/myorg/foo.jpg") //relative path
과
getClass().getResource("/com/myorg/foo.jpg")); //note the slash at the beginning
이 혼란으로 인해 리소스를로드 할 때 대부분의 문제가 발생합니다.
또한 이미지를로드 할 때 사용하기가 더 쉽습니다 getResourceAsStream()
.
BufferedImage image = ImageIO.read(getClass().getResourceAsStream("/com/myorg/foo.jpg"));
JAR 아카이브에서 (이미지가 아닌) 파일을 실제로로드해야 할 때 다음을 시도하십시오.
File file = null;
String resource = "/com/myorg/foo.xml";
URL res = getClass().getResource(resource);
if (res.getProtocol().equals("jar")) {
try {
InputStream input = getClass().getResourceAsStream(resource);
file = File.createTempFile("tempfile", ".tmp");
OutputStream out = new FileOutputStream(file);
int read;
byte[] bytes = new byte[1024];
while ((read = input.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.close();
file.deleteOnExit();
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
} else {
//this will probably work in your IDE, but not from a JAR
file = new File(res.getFile());
}
if (file != null && !file.exists()) {
throw new RuntimeException("Error: File " + file + " not found!");
}