본문 바로가기

TroubleShooting/Java

class path resource FileNotFoundException in jar

728x90

src/main/resource/ 디렉토리 하위에 "path/data.json" 경로의 파일을 넣어두고 아래와 같이 getFile() 을 사용하면 local 환경(inteliJ 같은 개발툴)에서 실행할때는 아무 문제가 없다. (실제 파일 경로가 있으니..)

File file = new ClassPathResource("/path/data.json").getFile();

 

그런데, jar 로 빌드 패키지를 만들어서 배포해서 java -jar 로 실행하면 "java.io.FileNotFoundException" 이 나오면서 프로그램이 종료한다.

2023-11-16 00:11:12.096 [main] ERROR [http://com.test.app.component.ReadComponet.init:38] - Failed to read file
java.io.FileNotFoundException: class path resource [path/data.json] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/C:/app/app.jar!/BOOT-INF/classes!/path/data.json
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:217)
at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:162)

 

jar 파일을 풀고 나서 실행하는게 아니다 보니, 실제 경로에 해당 파일이 없어서 인데 방법은 getFile() 말고 ClassPathResource("/path/data.json").getInputStream() 으로 InputStream 으로 받아서 처리를 해야한다. 

 

참고한 코드는 아래와 같다. 그리고 resource path 도 "path/data.json" 이 아니라 "/path/data.json" , 즉 "/" 로 시작해야 한다.

        String filePath = "/path/data.json";
        try (InputStream inputStream = getClass().getResourceAsStream(filePath); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
            return reader.lines().collect(Collectors.joining(System.lineSeparator()));
        }

 

참고

https://www.baeldung.com/spring-classpath-file-access