[AWS] EC2에서 프로젝트 build과정에서 생기는 오류(plain.jar파일 제거)

ᄋᄌᄒ·2023년 9월 25일
0
post-thumbnail

글을 쓰기 전에

방금 겨우 project test를 마쳤는데 바로 그다음인 build과정에서 생기는 오류가 있었다. 끓어오르는 화를 참고 이겨내보자.(그만 괴롭혀ㅓㅓㅓ)


📌 문제점

deploy.sh 파일을 만들어서 프로젝트 실행에 필요한 명령어들을 한꺼번에 실행하려고 하는데, 여기서 문제가 발생하고 있다. 문제 현장은 지금 소실되어서 없다.

No main Manifest Attribute in ~~ demo-0.0.1-SNAPSHOT-plain.jar ERROR

위와 같은 에러가 발생하고 있다.(에러 발생은 nohup.out파일 로그를 확인해보면 알 수 있다)

📌 방향

위와 같은 에러가 발생하면 ~/app/step1 에 있는 jar파일들을 확인해보자. 필자의 경우에는

  • awsStudy
  • awsStudy-0.0.1-SNAPSHOT-plain.jar
  • awsStudy-0.0.1-SNAPSHOT.jar
  • deploy.sh
  • nohup.out

와 같이 있었다.(이미 deploy.sh 실행 시키고나서의 결과이다.)
현 에러의 경우 plain.jar의 실행을 막아야한다.

  • 앱이름.jar → bootJar task로 생성된 것
    해당 파일은 해당 프로젝트에 필요한 모든 의존성이 같이 추가된 것으로, MANIFEST.MF까지 모두 정상적인 상태로 나옴.
  • 앱이름-plain.jar → build task로 생성된 것
    해당 파일은 의존성을 제외하고, 딱 프로젝트에 있는 자원들만 jar로 만든 것으로, MANIFEST.MF에 Main 메소드의 위치가 나오지 않는다.

[출처 1] https://velog.io/@kimsy8979/%ED%95%B4%EA%B2%B0-%EB%B0%B0%ED%8F%AC-%EC%8B%9C-%EC%98%A4%EB%A5%98-%EB%B0%9C%EC%83%9D-%EC%A0%91%EC%86%8D-%EC%95%88%EB%90%A8

이게 뭔소리지..

출처의 작성자분이 친절하게 다음글에 설명도 해주셨다.
[출처 2] https://velog.io/@kimsy8979/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8%EC%99%80-AWS%EB%A1%9C-%ED%98%BC%EC%9E%90-%EA%B5%AC%ED%98%84%ED%95%98%EB%8A%94-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%9B%84%EA%B8%B0-22

그니까 로직에 의존성이 추가된 [앱이름].jar을 잡아야 실행이 되는데, plain의 실행을 막지 못하면 자동으로 [앱이름].jar파일이 아닌 [앱이름-plain].jar파일이 실행되어, 메인 메서드의 위치를 잡지 못해 앱이 실행되지 못한다는 것이다.(사실 아직 정확히 메인메서드의 위치를 잡지 못한다는게 무슨 얘긴지 모르겠다)

📌 해결방법

여하튼 plain.jar파일의 실행을 막으면 된다는 얘기니까 검색검색
.
.
.
의 결과가 출처1 링크다.

방법이 총 두가지가 있다고 한다.
첫번째는 build.gradle에 아래와 같이 코드를 추가한다.

jar {
	enabled = false
}

두번째는 linux 명령어를 아래와 같이 입력한다.

ls -tr $REPOSITORY/*.jar | grep -v "plain" | tail -n 1

필자의 경우 두번째 명령어를 deploy.sh에 추가했더니 되었다. 아래는 deploy.sh파일이다.

#!/bin/bash

REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=awsStudy

cd $REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"

git pull

echo "> 프로젝트 Build 시작"

./gradlew build

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

cd $REPOSITORY

echo "> Build 파일복사"

cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

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

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

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

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

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

JAR_NAME=$(ls -tr $REPOSITORY/*.jar | grep -v "plain" | tail -n 1)

echo "> JAR Name: $JAR_NAME"

nohup java -jar \
        -Dspring.config.location=classpath:/application.yml \
        $JAR_NAME > $REPOSITORY/nohup.out  2>&1 &

이러면 plain.jar파일 실행을 막을 수 있다~


글을 마치며

이제야 프로젝트 실행까지 마쳤다. 챕터로는 하나였는데 거의 일주일 걸린 것 같다;; 물론 검색도 중요하지만 에러가 발생했을 때 로그를 좀더 자세히 읽어보도록 하자. 문제점은 로그에서 확인할 수 있으니까. 당연한 얘기지만...

0개의 댓글