본문 바로가기

서버

[Spring] Intellij에서 jar 파일 추출(배포) - 오류 해결 포함

1. 프로젝트 Build

AWS Lightsail에서 Ubuntu 환경의 서버를 생성 한 다음, 스프링 프로젝트를 build 하여 jar파일을 생성하고 서버에서 jar 파일을 실행하는 단계이다.

 

jar 파일이 우선 필요하므로 완성된 프로젝트를 build 한다. 아래 화면 참고

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.

task error

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
}