[트러블슈팅 - Spring] IDE 에서 되는데 배포하면 안 돼요

Hocaron·2023년 6월 19일
2

트러블슈팅

목록 보기
8/12
post-custom-banner

IDE 에서 잘 읽히던 파일이 배포하면 아래와 같은 에러가 났다.

Caused by: java.io.FileNotFoundException: class path resource [example.file] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/Users/122d6417/IdeaProjects/member-auth-service/app/app-client-api/build/libs/app-client-api-1.2.4.jar!/BOOT-INF/lib/domain.jar!/example.txt

에러가 발생하는 곳은 이곳이다.

val file = ClassPathResource("example.txt").file

JAR 로 실행하면 경로가 다른가

  • IDE 실행 경로(URL)
file:/Users/122d6417/IdeaProjects/member-auth-service/domain/build/resources/main/example.file
  • JAR 실행 경로(URL)
jar:file:/Users/122d6417/IdeaProjects/member-auth-service/app/app-client-api/build/libs/app-client-api-1.2.4.jar!/BOOT-INF/lib/domain.jar!/example.txt

jar 파일 내부로 들어갈 때 파일 경로에 !가 포함되게 된다.

File 은 경로를 왜 못 찾을까

file 로 시작하지 않으면, FileNotFoundException 에러가 발생하는군 🤔

해결방법

val file = ClassPathResource("example.txt").inputStream

InputStream 은 어떻게 둘다 찾을까

URL이 jar:file: 로 시작하는 jar 실행에서는 JarURLConnection.getInputStream() 사용

URL 이 file: 로 시작하는 IDE 에서는 FileURLConnection.getInputStream() 사용

URL 이 getResourceAsStream() 은 다형적으로 동작하도록 구현되어 있어서 두 상황 모두에서 잘 동작할 수 있다.

정리

  • InputStream(getResourceAsStream()) 을 사용하면, JAR 에서도 파일을 찾을 수 있다.
profile
기록을 통한 성장을
post-custom-banner

0개의 댓글