에러 상황
Spring Boot가 아닌 순수 Java 프로젝트를 생성한 후 배포를 위해 Jar파일을 만들던 도중 여러 문제가 발생했다.
1. Jar 파일 빌드 시 Main-Class를 찾지 못하는 에러
2. Class 내의 라이브러리를 찾지 못하는 에러
두 문제에 대한 래퍼런스가 많이 없어 블로그에 기록해본다.
에러 코드
1. no main manifest attribute
no main manifest attribute, in example.jar
2. Caused by: java.lang.NoClassDefFoundError: [라이브러리]
Error: Unable to initialize main class [패키지명]
Caused by: java.lang.NoClassDefFoundError: [라이브러리]
해결 방법
1. no main manifest attribute
build.gradle에 다음과 같은 설정을 추가한 후 clear -> build -> jar 를 순서대로 실행해주면 된다.
jar {
manifest {
attributes 'Main-Class': '[패키지 경로].[Main Class 파일명]'
}
}
하지만 2번 에러가 발생했다.
2. Caused by: java.lang.NoClassDefFoundError: [라이브러리]
순수 자바를 사용하는 경우도 드물고 이 에러에 대한 래퍼런스가 없어서 찾는데 시간이 걸렸다.
자바를 만들 때 라이브러리들을 import해서 만들었다면 1번의 방법으로 오류가 해결 될 것이다.
하지만 필자의 경우 gradle에 직접 라이브러리를 넣어서 만들어서 2번째 오류가 발생했다.
해결 방법은 직접 라이브러리를 추가해주거나 추가 플러그인을 사용하는 것이다.
필자는 추가 플러그인을 사용해서 해결했다.
build.gradle의 plugins과 jar 항목에 다음과 같이 플러그인을 추가한다.
plugins {
id 'java'
// 플러그인 추가
id 'com.github.johnrengelman.shadow' version '8.1.1'
}
jar {
// 설정 추가
finalizedBy shadowJar
manifest {
attributes 'Main-Class': '[패키지 경로].[Main Class 파일명]'
}
}
gradle 파일을 새로 빌드한 후 clear -> build -> jar 순서대로 실행하면 '-all.jar'라는 파일이 하나 더 생성된다.
해당 파일을 명령어로 실행하면 정상적으로 동작되는 것을 확인할 수 있다.
참고 사이트
https://teching.tistory.com/162
Gradle을 이용한 순수 자바 Jar 만들기
스프링 부트에서는 간단하게 bootJar 커맨드를 이용해서 Jar파일로 만드는 것이 간편했지만 자바만 사용했을 때에는 몇 가지 작업을 해주어야 한다. 1. Gradle plugin 설정 그래들에는 Java에 관련된 Task
teching.tistory.com
https://imperceptiblethoughts.com/shadow/getting-started/#default-java-groovy-tasks
Getting Started
Getting Started Alternatively, the plugin can be added to the buildscript classpath and applied: NOTE: The correct maven coordinates for each version of Shadow can be found by referencing the Gradle Plugin documentation here(opens new window) . Shadow is a
imperceptiblethoughts.com
댓글