no main manifest attribute, in ~/SNAPSHOT-plain.jar

Yushin·2024년 2월 25일
0

트러블슈팅

목록 보기
6/9

상황

EC2에서 작성한 스크립트를 통해 스프링부트 jar 파일을 실행하던 도중 발생하였다.

deploy.sh - 배포를 위한 스크립트 파일

#!/bin/bash

# (1)
REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=springboot-aws-study

# (2)
cd $REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"

# (3)
git pull

echo "> 프로젝트 Build 시작"

# (4)
./gradlew build

echo "> step1 디렉토리로 이동"

cd $REPOSITORY

echo "> Build 파일 복사"

# (5)
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션pid 확인"

# (6)
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

echo "> 현재 구동중인 애플리케이션 pid: $CURRENT_PID"

# (7)
if [ -z "$CURRENT_PID" ]; then
        echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
        echo "> kill -15 $CURRENT_PID"
        kill -15 $CURRENT_PID
        sleep 5
fi

echo "> 새 애플리케이션 배포"

# (8)
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

# (9)
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &

오류 메세지

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


원인

오류 메세지를 해석해보면 spring-aws-study-0.0.1-SNAPSHOT-plain.jar 를 실행하기 위한 메인메소드를 찾지 못했다는 뜻이다.

프로젝트를 빌드하면 MANIFEST.MF 라는 파일이 생성되고 여기에 메인메소드에 대한 정보가 담겨있다.
spring boot 2.5.0 버전 이상부터는 gradle로 빌드할 때 jar파일이 2개 생성되는데 하나는 [서비스명.jar] -> bootJar Task 로 생성되고 또 다른 하나는 [서비스명-plain.jar] -> build Task 로 생성된다.

여기서 ~SNAPSHOT-plain.jar 는 의존성을 제외하고 프로젝트에 있는 자원들만 가지고 있는 파일이다.
그러므로 spring 관련 의존성이 빠져 MANIFEST.MF에 main 메소드가 존재하지 않아 오류가 발생하는 것이다.

빌드 후 지정된 JAR Name 이 ~SNAPSHOT-plain.jar 인 것을 볼 수 있다.


해결

해결 방법은 두 가지가 존재한다.

1. ~SNAPSHOT-plain.jar 을 생성하지 않도록 설정

build.gradle 에 해당 코드를 추가하고 깃허브에 푸쉬한다.

jar {
	enabled = false
}

** 나는 이 방법을 적용해도 해결되지 않아 아래의 방법을 사용하였다.

2. ~SNAPSHOT-plain.jar 이 생성은 되지만 선택되지 않도록 설정

배포 스크립트 파일에서 jar 파일을 선택하는 코드를 plain이 포함된 파일은 선택되지 않도록 수정한다.

deploy.sh

# 수정 전
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)

# 수정 후
JAR_NAME=$(ls -tr $REPOSITORY/ | grep -v "plain" | tail -n 1)

결과

스크립트를 재실행 해보면 ~SNAPSHOT-plain.jar 이 아닌 ~SNAPSHOT.jar 이 선택된 것을 확인할 수 있다.

0개의 댓글