프로젝트를 배포하는 과정에서 다음과 같은 코드에서 FileNotFoundException 오류가 발생했다.
Resource resource = resourceLoader.getResource("classpath:...");
File file = resource.getFile();
resorce.getFile()을 하는 과정에서 파일 경로를 찾지 못하는 오류가 발생했다. 왜그러지?
getFile()메서드가 있는 Resource 인터페이스에서 코드를 한번 살펴보자. 확인해보면 다음과 같은 설명이 적혀있다.
FileNotFoundException – if the resource cannot be resolved as absolute file path, i.e. if the resource is not available in a file system
FileNotFoundException 오류는 resource가 파일시스템에서 사용 가능하지 않은 경우라고 한다. 이 부분 때문에 오류가 발생하는 것인데 jar파일은 파일시스템에서 찾을 수 없는 경로에 위치해 있기 때문에 resource를 찾을 수 없는 것이다.
다행히 해결방법은 간단하다. InputSteam을 활용하여 파일을 읽어오면 된다.
//변경 전
Resource resource = resourceLoader.getResource("classpath:...");
File file = resource.getFile();
//변경 후
Resource resource = resourceLoader.getResource("classpath:...");
InputStream inputStream = resource.getInputStream();
File tempFile = convertInputStreamToFile(inputStream);
jar파일로 변환을 하면 jar파일을 파일 시스템에서 인식을 할 수 없기 때문에 getFile()을 사용할 수 없다. 앞으로 resource.getFile()을 사용할때는 jar파일로 변환 후 상황도 생각하여 InputSream을 사용하는 습관을 들여야 되겠다.
https://madplay.github.io/post/filenotfoundexception-when-running-as-jar