<2>Java Spring, JPA 프로젝트 배포 도전기, 근데 이제 오류를 곁들인...

timo·2021년 8월 24일
1

troubleshooting

목록 보기
10/11
post-thumbnail

😅 Java Spring, JPA 프로젝트 배포 도전기 1 에 이어 계속해서 진행 중이다. 지난번 gradlew test 를 성공시키는 것 까지 진행했는데.. 오류는 끝이 없다 ㅎㅎ

📌 EC2 프로젝트 build 실패

👉 1. application.yml datasource로 인한 build 실패

./gradlew test 성공 이후 deploy.sh를 작성하여 호기롭게 실행했지만... 역시나 오류를 접할 수 있었다.

Could not compile build file '~~~/build.gradle'
~~
dependencies {

메세지 상으론 build.gradle에서의 문제인 듯 보였지만, application.yml에서 datasource에 대한 정보를 정확하게 적어주지 않아 발생한 문제였다. branch를 삭제하려고 하니 아래와 같은 에러메세지가 발생했다.

aws RDS에 대한 정보를 정확히 적어넣어 주었다.


😅 번외: git 관련 오류

application.yml을 수정하고 git push, EC2 인스턴스에서 git pull 등을 진행했지만, 중간 다른 수정사항 때문에 tree형태가 꼬여있었다.

you need to resolve your current index first

https://euna501.tistory.com/entry/Github-error-needs-merge

git reset --merge 를 통해 해결할 수 있었다.


👉 2. Permission denied

위 git 오류와 관련하여 rebase한 file을 받으니 권한이 사라져 있었다.

다시 chmod +x ./gadlew 로 권한을 주었다.


👉 3. 불필요한 의존관계로 인한 build 실패

Execution failed for task ':processResources'.
> Entry application.yml is a duplicate but no duplicate handling strategy has ..

다음과 같은 에러 메세지였다. 해당 내용은 구글링을 해도 잘 나오지 않아 애를 먹었다. 결국 구글링보단 내 프로젝트의 코드를 좀 더살펴보자는 생각이 들었고, build.gradle 파일을 좀 더 살펴보았다.

살펴보던 중 해당 프로젝트에서 우리 팀원이 다른 branch에서 작업하는, 나의 branch에선 쓰이지 않는 내용을 발견했다.

혹시..? 하는 마음과 함께 삭제 후 빌드를 시도했는데 .. 빌드는 성공했다!


📌 jar 파일 실행 불가

ps -ef|grep dnd-5th-4-backenddnd-5th-4-backend라는 이름을 가진 실행되고있는 프로세스를 찾는 명령어이다.
빌드는 성공했지만, 아래 캡쳐본 처럼 실행중인 jar파일을 찾을 수 없었다.

👉 1. deploy.sh 에서 JAR Name 설정 오류

우선 첫번째로 발견한 문제점은 다음과 같았다. 빌드 후 생성된 파일을 살펴보니 이름 형태가 아래 캡쳐와 같은 형태였다.

team4backend의 형태인데, 무언가 이상함을 느껴 내가 작성한 deploy.sh 를 다시 살펴보았다.

하단 JAR_NAME 을 설정하는 코드를 살펴보면 dnd-5th-4-backend 라고 설정한 것을 확인할 수 있었다. 우리 프로젝트는 archivesBaseName을 따로team4backend로 설정해놓았는데, 이를 무시하고 그냥 git 저장소 이름으로 설정한 것이었다.

CURRENT_PID=$(pgrep -f team4backend)

JAR_NAME=$(ls $REPOSITORY/ |grep 'team4backend' | tail -n 1)

이렇게 수정한 뒤 정확한 JAR의 이름을 찾는것을 확인할 수 있었다.


😅 번외: ddl-auto 관련

이렇게 오류가 반복되어 로컬, gradle로 aws RDS로 datasource를 설정하여 실행해 보았다. table이 생성되지않아 오류가 발생했는데,

https://deep-dive-dev.tistory.com/31

ddl-auto 를 none으로 유지해놓아 생긴 문제였다. create로 바꾸어 한번 실행해주니 table이 잘 생성되었다.


👉 2. META-INF/MANIFEST.MF 관련 부재

로컬, gradle로 정상적으로 실행되는 것이 확인되어 -> 로컬, jar 형태로 실행해보았다.

no main manifest attribute, in team4backend-0.0.1-SNAPSHOT-plain.jar

위와 같은 에러메세지와 함께 jar파일이 실행되지 않았다.

구글링 결과 다음의 stackoverflow 게시글을 발견할 수 있었다.
https://stackoverflow.com/questions/9689793/cant-execute-jar-file-no-main-manifest-attribute

META-INF/MANIFEST.MF 라는 파일을 jar로 만들어야 했는데, 다음과 같은 코드로 가능했다.

자신의 main method가 있는 클래스를 위와 같이 추가해주었다.

하지만 계속해서 다른 오류가 발생했다.


👉 3. plain.jar에 대한 지식 부족

이와 같은 에러가 또다시 나타났는데, 이 역시 생각보다 구글링해도 찾기 어려웠다.

https://ashespia.tistory.com/44
그래도 해당 게시글이 자세히 설명된 것 같아 따라하며 나의 jar파일을 둘러보려는 중

~plain.jar~~.jar의 용량 차이가 상당한 것을 발견했다. 이를 보고 설마...? 라는 느낌과 함께 plain이 아닌 파일을 실행해 보았다.

로컬에서 정상적으로 실행되었다.
나는 일반 jar파일과 plain.jar파일의 차이를 알지 못했고, ec2 인스턴스에서 계속해서 plain.jar 파일을 실행했음에도 나는 이상한 점을 알지 못했던 것이다. 멍청

🤔 plain.jar 이 생성되지 않도록 하기

https://stackoverflow.com/questions/67663728/spring-boot-2-5-0-generates-plain-jar-file-can-i-remove-it

이렇게 enabled = false를 추가하여 plain.jar이 생성되지 않도록 했다.


결국...! 😭

이렇게 다양한 고난을 거쳐

  • plain.jar이 아닌 jar build에 성공했고
  • 정상적으로 jar 파일이 실행되는 것을 확인했다!
  • 또한 postman으로 서버의 정상작동도 확인할 수 있었다.

profile
Backend Developer

0개의 댓글