티스토리 뷰

반응형

부제: Excutable JAR AutoConfiguration 문제 해결, Spring boot JAR 배포, Spring boot 원격 서버에 배포하기


 Spring boot가 기존의 Spring에 비해 편리한 점은 꽤 많을 것이다. 그 중에서도 대표적인 것 하나를 꼽으라면 실행가능한 JAR(Executable JAR)라고 할 수 있다.


 Maven, Gradle등의 dependency tool을 이용하여 WAR파일을 생성한 후(build) tomcat과 같은 WAS에 배포하여 웹 애플리케이션을 구동하는 것이 기존의 Spring이었다. 반면에 Spring boot는 JAR파일에 내장 톰캣이 존재하여, JAR파일을 빌드하고 단순히 실행하는 것만으로 웹 애플리케이션 구동이 가능하다.



▶ JAR의 사전 속 의미는 "(꿀, 잼 등을 주로 담아놓는) 병"이다.




 로컬에서 개발하며 테스트하는 경우, 내장된 gradle을 통해 아래와 같은 간단한 명령어로 애플리케이션을 실행할 수 있었다. 


1
./gradlew bootrun
cs



 하지만 다른 서버에 배포하려면 JAR파일을 따로 생성하는 방법밖에 없다. 이번 포스팅에서는 그 방법에 대해 다루려고 한다. 필자는 Intelli J와 gradle을 사용한다. 이걸 해내려고 꼬박 4일을 해맸다.

먼저 build.gradle에 아래와 같은 문구를 추가한다.






위 코드는 buildscript작성을 통해 Spring boot에서 제공하는 Gradle-plugin을 적용하는 설정이다.




이 코드는 manifest를 정의하는 작업인데, 이 작업없이 그냥 JAR를 만들면, manifest정보가 없다는 오류를 뱉어내기 때문에 반드시 위 작업을 수행해야한다. 



그후, Intelli J의 우측하단 'gradle'탭에서 jar task를 찾아 더블클릭으로 실행하면 될 줄 알았는데...





 spring-factories에서 AutoConfiguration관련 오류가 발생했다. 이 문제를 해결하려고 수십시간을 씨름한 것 같은데, 생각보다 해결방법은 간단했다. gradle build task jar를 사용해 산출된 JAR파일은 우리가 가장 먼저 했던 gradle-plugin을 사용하지 않고 생성된 JAR이었다.


 이미 JAR가 생성된 후, gradle build task build로 다시 진행해보면 xxxx.jar.original 이라는 파일이 생성된다. (아까처럼 인텔리제이의 좌측하단 gradle 탭을 이용하면 편리하게 'build'를 더블클릭하여 task를 시작할 수 있다.)





jar파일이 생성된 상태에서 build task를 진행해야만 original 파일이 생기는 것 같다. (이유는 조금 더 찾아봐야 한다.) 그리고 완성된 jar 파일 (jar.original 파일이 아님!!)을 아래 명령어를 사용하여 실행하면 정상적으로 내장 톰캣이 동작하며 앱이 배포된다.


1
java -jar XXXXXX.jar
cs





-끝-





참고 및 출처

https://spring.io/

http://theeye.pe.kr/archives/tag/gradle

https://stackoverflow.com/questions/38792031/springboot-making-jar-files-no-auto-configuration-classes-found-in-meta-inf




«   2022/06   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
글 보관함
Total
810,030
Today
11
Yesterday
243