github action으로 spring boot 프로젝트 배포하기 실행 중 Git action과 AWS CodeDeploy에서는 정상으로 뜨는데 서버실행이 되지 않아 서버를 살펴보니 아래 사진과 같이 nohup로 백그라운드 실행이 되지 않고 있고 .jar file이 2개가 존재하였습니다.
<사진 1>. two jar files exist
그래서 이에대한 원인을 찾아보도록 하였습니다.
Spring boot Gradle Plugins 가 2.0 버전이 되면서 기존에 있던 bootRepackage
가 bootJar
와 bootWar
로 변경되었다고 합니다. 확인해보니 저의 프로젝트 역시 아래와 같이 plugins 버전이 2.7.3을 사용하고 있었습니다.
plugins {
id 'org.springframework.boot' version '2.7.3'
}
하지만 문제는 여기서부터 발생하였습니다. Spring docs를 찾아보니 Spring boot 2.4 버전까지는 이 bootJar
혹은 bootWar
이 설정되어있다면, jar
or war
은 수행되지않고 사라졌지만 Spring boot 2.5 버전 이후 부터는 bootJar
이나 bootWar
이 설정되어 있더라도 jar
or war
역시 수행되는 대신 plain 형식으로 결과물을 내어 두 작업이 다른 결과물을 생성하게 됩니다. 실제로 아래와 같이 build를 하니 Task :bootJar
와 Task :jar
가 둘 다 실행되는 것을 볼 수 있었습니다.
<사진 2>. build Tasks
<사진 3>. Spring boot 2.4.11 docs
<사진 4>. Spring boot 2.5.0 docs
BootJar로 생성된 jar 파일은 executable jar file로 어플리케이션 실행에 필요한 모든 의존성을 함께 빌드합니다.
그러므로 이 파일은 java -jar 명령어를 통해 실행이 가능합니다. 따라서 배포용으론 이 jar파일을 사용해주어야 합니다.
Jar로 인해 생성된 jar파일은 plain jar file로 소스코드의 클래스 파일과 리소스 파일만 포함하고 있습니다.
그러므로 이 파일로 java -jar 명령을 실행하는 경우 어플리케이션 실행에 필요한 의존성을 포함하지 않고 있기 때문에 Manifest 속성이 없다면서 error가 발생합니다.
2가지의 packaging에 관한 task가 수행되므로 build.gradle에 설정을 추가하여 jar task를 skip시켜주면 됩니다.
그러면 1개의 executable jar가 생성이 되고 이를 통해 배포를 하면 됩니다.
jar {
enabled = false
}
📌 참고
jar 수행을 유지하면서 executable jar를 사용하고 싶다면 classifier 설정을 해주면됩니다.