본문 바로가기
개발/기타

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

by 궁즉변 변즉통 통즉구 2023. 7. 22.
반응형

일반적으로 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 파일을 풀어서 보면 다음과 같다.

 

반응형

댓글