방금 겨우 project test를 마쳤는데 바로 그다음인 build과정에서 생기는 오류가 있었다. 끓어오르는 화를 참고 이겨내보자.(그만 괴롭혀ㅓㅓㅓ)
deploy.sh 파일을 만들어서 프로젝트 실행에 필요한 명령어들을 한꺼번에 실행하려고 하는데, 여기서 문제가 발생하고 있다. 문제 현장은 지금 소실되어서 없다.
No main Manifest Attribute in ~~ demo-0.0.1-SNAPSHOT-plain.jar ERROR
위와 같은 에러가 발생하고 있다.(에러 발생은 nohup.out파일 로그를 확인해보면 알 수 있다)
위와 같은 에러가 발생하면 ~/app/step1 에 있는 jar파일들을 확인해보자. 필자의 경우에는
와 같이 있었다.(이미 deploy.sh 실행 시키고나서의 결과이다.)
현 에러의 경우 plain.jar의 실행을 막아야한다.
- 앱이름.jar → bootJar task로 생성된 것
해당 파일은 해당 프로젝트에 필요한 모든 의존성이 같이 추가된 것으로, MANIFEST.MF까지 모두 정상적인 상태로 나옴.- 앱이름-plain.jar → build task로 생성된 것
해당 파일은 의존성을 제외하고, 딱 프로젝트에 있는 자원들만 jar로 만든 것으로, MANIFEST.MF에 Main 메소드의 위치가 나오지 않는다.
이게 뭔소리지..
출처의 작성자분이 친절하게 다음글에 설명도 해주셨다.
[출처 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파일 실행을 막을 수 있다~
이제야 프로젝트 실행까지 마쳤다. 챕터로는 하나였는데 거의 일주일 걸린 것 같다;; 물론 검색도 중요하지만 에러가 발생했을 때 로그를 좀더 자세히 읽어보도록 하자. 문제점은 로그에서 확인할 수 있으니까. 당연한 얘기지만...