@참고: https://nankisu.tistory.com/93
executable.jar 의 구조
src/main/resources 에 있는 service-config.properties 를
executable jar 로 만들면
jar 내부에 /resources/serivce-config.properties 로 묶인다.
executable.jar 내부의 파일 읽는법
1. local에서 코드를 실행시킬 때는 temp.txt 파일이 소스폴더에 독립적인 하나의 파일로 존재하기 때문에 정상적으로 실행된다.
// resources 폴더에 있는 temp.txt 파일을 읽어온다.
File file = new File(new ClassPathResource("temp.txt").getURI());
2. 개발계에는 jar파일이 실행되기 때문에 temp.txt가 독립된 파일이 아니라 jar파일의 데이터 일부분으로서 하나의 온전한 파일로 가져올 수 있다.
// File로 가져오는 것이 아니라 InputStream으로 내용을 읽어오도록 수정. InputStream is = new ClassPathResource("temp.txt").getInputStream();
1번에 의해 발생할 수 있는 에러
java.lang.IllegalArgumentException: URI is not hierarchical
이런 exception 이 나는 이유는
path 가 rsrc:/ 와 같이 생성되기 때문이다.
따라서 path 로 읽으려 하면 안되고 2번의 이유에 의해서 inputstream 으로 읽어오는 것이다.
executable.jar 내부 파일 위치에 해당하는 path
이때, executable.jar 의 위치부터 경로를 정해주기 위해 path 는 "/" 로 시작해야 한다. 따라서 path = /resources/serivce-config.properties 여야 jar 내부에 /resources/serivce-config.properties 를 잘 가져온다.
내 경우에는 아래의 코드를 사용하였다.
InputStream is = clazz.getResourceAsStream(path);