대빵's Blog

gradle executable jar 만들기 본문

개발관련

gradle executable jar 만들기

bigzero 2021. 12. 7. 18:23

springboot 는 워낙 편의장치가 많아서 별 고민안했는데 간만에 Main 하나 만들려니 gradle 대충알다가 엄청난 삽질을...

일단 gradle version 은 7.3.1 이다. 이것도 버전별로 워낙 변경사항이 많아서 버전별로 다른 내용이 많으니 참고

아래는 build.gradle 내용임

plugins {
    id 'application'
    id 'java-library'
    id 'org.jetbrains.kotlin.jvm' version '1.5.10'
}

repositories {
    mavenCentral()
}

dependencies {
    // https://mvnrepository.com/artifact/org.redisson/redisson
    implementation group: 'org.redisson', name: 'redisson', version: '3.2.0'
}

def version = '0.1'
def mainClassName= 'MainKt'

// gradle default jar 를 커스터마이징 한다.
// manifest default 생성값을 제외하고 별도로 만들어준다.
jar {
    manifest {
        attributes(
            'Title': 'RedisDistributedLock',
            'Version': version,
            'Main-Class': mainClassName,
        )
    }
    from(configurations.runtimeClasspath.collect {
        it.isDirectory() ? it : zipTree(it)
    }) {
        exclude 'META-INF', 'META-INF/**'
    }
}

위의 코드에서 가장 중요한 부분은 jar 부분

일단 jar 실행파일을 만들려면 두가지를 해결해야 한다. 1. 참조되는 라이브러리들을 넣어줘야 한다. 2. manifest 를 만들어 넣어야 한다.

gradle command(./gradlew clean build)로 jar를 만들면 하단에 jar 부분이 기본적으로 없어도 된다. 그래도 jar는 만들어지고 manifest도 생성된다.

문제는 executable jar 를 만들려면 gradle의 기본 jar를 위에 내용처럼 override 해서 정의하면서 from 절에 참조되는 라이브러리를 넣도록 해야 되는데 이때 자동으로 만들어진 manifest와 jar를 override 하면서 만들어진 manifest 두개가 동시에 만들어지면서 gradle 에서 멀티(?) manifest 에러가 발생한다.

그래서 from 에서는 manifest를 exclude로 제거하고 manifest를 내가 임의로 넣어주는 것을 추가하여 위의 코드처럼 build.gradle 을 구성한다.

참고로 위의 gradle 은 Redis 분산락을 테스트하는 코드이다. 전체코드는 여기서 참고 (코틀린이다.)