fat jar란?

greenTea·2024년 1월 8일
0

도커 빌드 에러 해결: Fat-JAR 생성하기

도커를 통해 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 파일이 생성됩니다.

결과

Fat-JAR

이렇게 설정하고 빌드를 하면 /build/libs 폴더에 app.jar라는 파일이 생성됩니다. 이 파일은 모든 라이브러리를 포함하고 있으며, 크기가 상당히 큰 것을 확인할 수 있습니다.

이를 통해 도커로 빌드를 하게 되면 성공적으로 의존성 문제가 생기지 않고 진행이 되는 것을 알 수 있습니다.

profile
greenTea입니다.

0개의 댓글