./gradlew bootRun vs java -jar로 실행할 때의 차이점 (리소스 경로)
😰 상황
./gradlew bootRun으로 스프링 부트 실행할 때 동적 페이지 리소스 경로에 문제가 없었다.
하지만 heroku 배포할 때 ./gradlew bootRun으로 자바 프로젝트가 실행되는 것이 아니라 빌드된 jar 파일을 실행하여 작동한다. 이때 java -jar로 실행할 때 동적 페이지 리소스 경로에 문제가 발생하였다.
🤔 원인
./gradlew bootRun 실행과 java -jar jarPath로 실행할 때 리소스 위치가 다르다.
gradle의 경우 좀 더 유연한 기능을 제공하지만 java -jar 로 실행할 때 문제가 될 수 있다.
✅ 해결
java-spring-cafe 프로젝트 commit 중 : fix 동적 리소스 경로 에러 수정
만약 resource/index.html을 동적 리소스로 응답한다고 가정한다면
./gradlew bootRun으로 실행할 때 컨트롤러에서 경로를 "index" or "/index" 모두 문제 없이 응답해준다.
java -jar 으로 실행할 때 "/index"는 찾지 못한다. "index"만 인식한다.
mustache도 마찬가지다.
"/"를 제거해주자
📝 결론
./gradlew bootRun와 java -jar로 실행할 때 리소스 경로가 다르다.
gradle 실행이 좀 더 유연하게 처리해준다. 하지만 배포 환경이 다를 수 있으니( java -jar로 실행) 리소스 경로에 주의하자
+a) 구글 검색을 해봤지만 동일한 질문만 있고 답변이 없었다. 혹시라도 아시는 분이 계시다면 댓글 남겨주시면 감사합니다.
(classPath 차이일까?)
Reference
스택 오버플로우 : difference between gradle boot run and bootjar build in a spring boot application