[스프링부트] Plain Jar (+ Jar task 비활성화)

HONG·2023년 8월 31일

스프링 부트

목록 보기
1/1

에러 : no main manifest attribute

EC2에서 스프링 부트 프로젝트를 gradlew로 빌드하던 중, 로그에 no main manifest attribute라는 에러가 나왔다.

no main manifest attribute, in /home/ec2-user/app/step1/springboot-webservice-1.0-SNAPSHOT-plain.jar


no main manifest attribute in은 jar파일에서 처음 호출할 Main 메소드를 찾지 못해 발생하는 에러라고 한다.

build.gradle에 메인 메소드 위치를 명시하거나 의존성으로 해결할 수 있는데 내 경우는 이게 아니었다.



plain-jar

spring boot 2.5.0버전 이상부터는 gradle로 빌드를 할때 jar파일이 2개 생성된다. (참고: StackOverflow)

  1. .jar
    • bootJar Task로 생성된것
    • 프로젝트에 필요한 모든 의존성이 포함됨
    • Executable jar라고도 불린다

  2. -plain.jar
    • jar Task로 생성된것
    • 의존성을 제외하고 프로젝트 자원들만 jar을 생성
    • 스프링관련 의존성이 제외돼 MANIFEST.MF에 Main메소드의 위치가 나오지 않음

즉, 내 스크립트 파일이 두 개의 jar 중 -plain.jar 파일을 실행했기 때문에 Main 메소드를 찾지 못해서 발생한 오류였다.



해결책 : jar task 비활성화

나는 plain jar 파일이 필요하지 않아 아예 생성되지 않도록 하고 싶다.

두 번째 코드블럭을 보면 disable its task 하는 방법, 즉 plain jar를 생성하는 jar task를 비활성화하는 방법이 나와 있다.

참고로 버전마다 적용 방법이 다르니 직접 찾아보아야 한다.

스프링 부트 2.7.14 공식문서
https://docs.spring.io/spring-boot/docs/2.7.14/gradle-plugin/reference/htmlsingle/#packaging-executable.and-plain-archives
(자신의 스프링 부트 버전에 맞게 URL 중간의 숫자를 변경하면 된다)


위에서 찾은 코드를 build.gradle 파일에 추가해주고 다시 빌드하면

tasks.named("jar") {
	enabled = false
}

로그에서 Task :jar SKIPPED를 확인할 수 있다.


이렇게 하면 EC2에서 배포 스크립트도 의도대로 작동한다!

0개의 댓글