개발/기타

Gradle fat jar(의존성 포함한 jar) 생성, shadow plugin 활용

궁즉변 변즉통 통즉구 2023. 7. 22. 18:47
반응형

일반적으로 Gradle로 jar를 빌드하게 되면

의존성을 설정한 외부 라이브러리(dependency)들은 포함이 되어있지 않다. dependency가 모두 포함된 jar로(fat jar) 빌드하기 위해서는 jar 빌드 시 아래 설정들을 추가해준다. 

 

적용한 gradle 버전은 7.4 기준이다.

jar{
    enabled=true
    archiveClassifier = '' // use empty string

    from { // 의존성 포함
        configurations.runtimeClasspath.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE  // 중복처리
}

 

설정된 jar로 빌드를 하고 압축을 풀어보면 다음과 같이 모든 의존성이 포함이 되어 있다. 의존성들이 jar형태가 아닌 압축이 모두 풀려있다.

 

 

조금 더 간단하게는 Shadow라는 Gradle Plugin을 사용하는 방법도 있다. 

https://github.com/johnrengelman/shadow

 

GitHub - johnrengelman/shadow: Gradle plugin to create fat/uber JARs, apply file transforms, and relocate packages for applicati

Gradle plugin to create fat/uber JARs, apply file transforms, and relocate packages for applications and libraries. Gradle version of Maven's Shade plugin. - GitHub - johnrengelman/shadow: Grad...

github.com

 

이 Plugin을 적용해도 동일하게 jar가 빌드되는데 설정은 다음과 같다. plugin을 선언하고, jar 빌드 시 shadowJar가 실행되도록 finalizedBy를 설정해준다.

plugins {
    id 'org.springframework.boot' version '2.6.7'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.2'  // Shadow
}

...

jar{
    enabled=true
    archiveClassifier = ''
    finalizedBy shadowJar  // shadowJar Task 실행
}

 

빌드를 하게 되면 일반 jar파일과 xxxx-all.jar 파일 2개가 생기는데 xxx-all.jar 파일을 풀어서 보면 다음과 같다.

 

반응형