1. 프로젝트 Build
AWS Lightsail에서 Ubuntu 환경의 서버를 생성 한 다음, 스프링 프로젝트를 build 하여 jar파일을 생성하고 서버에서 jar 파일을 실행하는 단계이다.
jar 파일이 우선 필요하므로 완성된 프로젝트를 build 한다. 아래 화면 참고
1. Intellij 우측 탭중 Gradle을 누르고, 2. sbb(프로젝트)/Tasks/build/build를 더블클릭하여 실행한다.
Execution failed for task ':bootJar'.
> Entry META-INF/MANIFEST.MF is a duplicate but no duplicate handling strategy has been set.
build 하면 위와 같은 오류가 발생.
이유는 bootJar 이라는 task를 수행하는 중에 META-INF/MANIFEST.MF 라는 파일이 이미 있는데 한번 더 만드려는 시도가 있었기 때문이다.
2. bootJar 오류 해결
오류 해결을 위해서는 META-INF/MANIFEST.MF 파일 중복을 없애는 코드가 필요하며, 이는 build.gradle 파일에 작성한다.
그리고 이전에 진행한 build와 꼬이지 않게 clean 후에 다시 build 한다.
1. clean 더블 클릭해서 build 된 것을 지우고, 다시 2. build를 더블 클릭해서 프로젝트를 build 한다.
build.gradle
tasks.withType(Jar){
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
manifest {
attributes["Main-Class"] = "com.mysite.sbb.SbbApplication"
}
}
첫 번째로 시도해본 방법이다.
tasks.withType(Jar)은 Jar과 관련된 모든 task에서 적용하겠다는 뜻이다.
스택 오버 플로우에서 duplicatesStrategy = DuplicatesStrategy.EXCLUDE 로 중복을 없애고, manifest {...} 으로 Main-Class를 다시 지정해줘야 한다고 해서 시도해봤다.
결과는 build는 성공이었다.
그러면 build 하여 생성된 jar 파일을 실행해보자.
build가 성공하면 왼쪽 Project 탭에서 프로젝트 안에 build 폴더가 생성된 것을 확인할 수 있다.
build/libs/sbb-0.0.1-SNAPSHOT.jar 이 서버에 올릴 jar 파일이다.
Intellij 터미널에서 바로 실행해봤다. (빨간색이 입력 부분)
C:\Users\master\IdeaProjects\sbb> cd build/libs
먼저 생성된 build/libs 폴더에 들어간다.
C:\Users\master\IdeaProjects\sbb\build\libs> java -jar ssb-0.0.1-SNAPSHOT.jar
그런 다음, jar 파일을 실행한다.
결과는 아래와 같은 오류가 발생했다.
Error: Could not find or load main class com.mysite.sbb.SbbApplication
Caused by: java.lang.ClassNotFoundException: com.mysite.sbb.SbbApplication
오류가 발생하여 build.gradle을 아래와 같이 수정하고 다시 build 를 시도해봤다.
build.gradle
tasks.withType(Jar){
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
jar까지 실행한 결과 프로젝트가 성공적으로 실행됐다.
아래 코드에서 오류가 발생한 이유는 duplicatesStrategy = DuplicatesStrategy.EXCLUDE를 적용해서 MANIFEST.MF 파일 중복을 없애고, 다시 manifest {...}으로 메인 클래스를 한번 더 지정해줘서 이미 있는 MANIFEST.MF의 메인 클래스와 꼬인 것이 문제인 것 같다.
이 문제의 정확한 원인을 아시는 분은 댓글로 알려주시면 감사하겠습니다. 🙂
tasks.withType(Jar){
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
manifest {
attributes["Main-Class"] = "com.mysite.sbb.SbbApplication"
}
}
build.gradle
bootJar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
3. 결론
Execution failed for task ':bootJar'.
> Entry META-INF/MANIFEST.MF is a duplicate but no duplicate handling strategy has been set.
이 에러가 발생하면 괜히 manifest {...}은 작성하지 않고, 그냥 아래 코드만 작성해본다. (그래도 오류 발생하면 그때 해결 방법찾기)
tasks.withType(Jar){
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
4. 참고
tasks.withType(Jar){
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
위 코드는 Jar과 관련된 모든 task에 적용되어서 이게 꺼려진다면 아래 코드를 사용하자. 아래 코드는 bootJar에만 적용된다.
bootJar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}