[Spring boot, Gradle] Spring boot 2.5 이상에서 빌드 시 2가지 jar가 생성(executable jar, plain jar)

김우진·2022년 9월 12일
0
post-thumbnail

들어가기 전...

github action으로 spring boot 프로젝트 배포하기 실행 중 Git action과 AWS CodeDeploy에서는 정상으로 뜨는데 서버실행이 되지 않아 서버를 살펴보니 아래 사진과 같이 nohup로 백그라운드 실행이 되지 않고 있고 .jar file이 2개가 존재하였습니다.

<사진 1>. two jar files exist

그래서 이에대한 원인을 찾아보도록 하였습니다.

Gradle Plugins이 bootJar로 변경

Spring boot Gradle Plugins 가 2.0 버전이 되면서 기존에 있던 bootRepackagebootJarbootWar로 변경되었다고 합니다. 확인해보니 저의 프로젝트 역시 아래와 같이 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 :bootJarTask :jar가 둘 다 실행되는 것을 볼 수 있었습니다.

<사진 2>. build Tasks

<사진 3>. Spring boot 2.4.11 docs

<사진 4>. Spring boot 2.5.0 docs

원인 파악

Executable Archive

BootJar로 생성된 jar 파일은 executable jar file로 어플리케이션 실행에 필요한 모든 의존성을 함께 빌드합니다.
그러므로 이 파일은 java -jar 명령어를 통해 실행이 가능합니다. 따라서 배포용으론 이 jar파일을 사용해주어야 합니다.

plain Archive

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 설정을 해주면됩니다.

참고 문헌 출처

썸네일 출처

unsplash페이지의 Brett Jordan님

0개의 댓글