도커를 통해 Java 애플리케이션을 빌드하는 도중 아래와 같은 의존성 에러가 발생하였습니다.
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException
jackson관련 라이브러리가 없다는 내용인데 build.gradle.kts를 확인한 결과 제대로 있는 것을 확인하였으며 실제로 로컬에서 jar를 가져와 실행한 경우 제대로 동작을 하였습니다.
이럴 때는 Fat-JAR를 생성하여 해결할 수 있습니다. Fat-JAR란 애플리케이션을 실행하는데 필요한 모든 라이브러리가 포함된 JAR 파일을 말합니다.
아래와 같은 에러가 발생하였습니다.
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException
이 에러는 Jackson 관련 라이브러리가 없다는 내용을 나타냅니다. build.gradle.kts
를 확인해 보았지만, 라이브러리는 제대로 설정되어 있었습니다. 또한, 로컬에서 JAR를 가져와 실행해 보았을 때는 문제가 없었습니다.
Gradle의 'shadow' 플러그인을 사용하여 Fat-JAR를 생성하면 이 문제를 해결할 수 있습니다. 아래는 build.gradle.kts
에 적용한 설정입니다.
plugins {
id("java")
id("com.github.johnrengelman.shadow") version "7.0.0"
}
...
// 의존성 설정
...
tasks {
shadowJar {
manifest {
attributes("Main-Class" to "check.CheckFileApplication")
}
archiveBaseName.set("app")
archiveClassifier.set("")
archiveVersion.set("")
}
}
네, 해당 코드는 Gradle의 'shadow' 플러그인을 사용하여 Fat-JAR를 생성하는 과정을 나타냅니다. 각 줄의 의미는 다음과 같습니다.
tasks {
shadowJar {
manifest {
attributes("Main-Class" to "check.CheckFileApplication")
}
archiveBaseName.set("app")
archiveClassifier.set("")
archiveVersion.set("")
}
}
tasks
: Gradle 빌드 과정에서 수행되는 작업들을 정의하는 곳입니다.shadowJar
: 'shadow' 플러그인의 메인 작업인 Fat-JAR를 생성하는 작업을 정의하는 곳입니다.manifest
: JAR 파일의 메타데이터를 정의하는 곳입니다.attributes("Main-Class" to "check.CheckFileApplication")
: 애플리케이션의 시작점이 되는 메인 클래스를 지정합니다. 여기서는 "check.CheckFileApplication" 클래스가 메인 클래스로 설정되었습니다.archiveBaseName.set("app")
: 생성되는 JAR 파일의 기본 이름을 설정합니다. 여기서는 "app"이라는 이름이 설정되었습니다.archiveClassifier.set("")
: 생성되는 JAR 파일의 분류자를 설정합니다. archiveVersion.set("")
: 생성되는 JAR 파일의 버전을 설정합니다. 여기서는 설정하지 않았으므로 기본적으로 버전 정보 없이 JAR 파일이 생성됩니다.이렇게 설정하고 빌드를 하면 /build/libs
폴더에 app.jar
라는 파일이 생성됩니다. 이 파일은 모든 라이브러리를 포함하고 있으며, 크기가 상당히 큰 것을 확인할 수 있습니다.
이를 통해 도커로 빌드를 하게 되면 성공적으로 의존성 문제가 생기지 않고 진행이 되는 것을 알 수 있습니다.