2024-02-16
1. 문제 발생
IDE에서는 src/main/.../test.properties 이런 식으로 사용해도 문제없이 동작을 했지만 -jar 파일로 생성 후 해당 부분을 그대로 쓰면 java.nio.file.NoSuchFileException 가 발생하게 된다.
2. 원인
배포시에 src/main/resources의 루트 경로가 target/classes 또는 build/classes로 변경되게 된다. 이를 위해 리소스 파일을 읽어 올 때는 동적으로 root를 잡을 수 있게 코드를 수정해야 한다.
3. 해결 방법
getClass.getClassLoader().getResourceAsStream('자신의 정적파일 위치')를 통해 자신이 위치시킬 파일의 정보를 읽어올 수 있다.
private InputStream getFileFromResourceAsStream(String fileName) {
//현재 클래스에서 루트 경로를 얻어 해당 파일을 정보를 읽어온다.
//만약에 파일 경로가 resources/config/test.properties 와 비슷한 형시이면
//fileName = config/test.properties; 와 같은 형식이 될 것이다.
ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(fileName);
// the stream holding the file content
if (inputStream == null) {
throw new IllegalArgumentException("file not found! " + fileName);
} else {
return inputStream;
}
}
4. 출처
https://mkyong.com/java/java-read-a-file-from-resources-folder/