본문 바로가기
자바(Java)

Gradle을 이용한 순수 자바 Jar 만들기

by codeyaki 2023. 6. 20.
반응형

스프링 부트에서는 간단하게 bootJar 커맨드를 이용해서 Jar파일로 만드는 것이 간편했지만 자바만 사용했을 때에는 몇 가지 작업을 해주어야 한다.

 

 

1. Gradle plugin 설정

그래들에는 Java에 관련된 Task들을 작업해 둔 기본 plugin이 존재한다. 이를 이용하면 빌드와 같은 작업들을 간단하게 할 수 있다.

build.gradle에 다음 구문을 추가해주면 된다.

plugins {
    id 'java'
}

이와 같이 추가해주고

gradle build
gradle jar

명령어를 실행해 주거나 인텔리제이에서 가장 우측에 보면 Gradle 탭이 있는데 거기에서 Tasks - build에 들어가서 build와 jar를 순서대로 작동시켜 주면 된다.

이렇게 하면 프로젝트 최상위 디렉터리에 build/libs 디렉터리가 생성되는데 그곳에 들어가 보면 .jar파일이 생성되어 있을 것이다.

하지만 이걸 실행하면 아래와 같이 "Manifest 속성이 없습니다."라는 문구가 나오면서 실행이 되지 않는다.

 

이를 해결하기 위해서는 Manifest 속성을 넣어주면 된다.

방법은 build.gradle에 다음과 같은 jar 설정을 넣어주면 된다.

jar {

    manifest {
        attributes 'Main-Class': 'Main 클래스 경로'
    }
}

 

  • Main-Class 속성에 메인 실행 클래스 위치를 작성해 주면 되는데 이때 src.java는 루트 콘텍스트 경로로 들어가 있으므로 그 뒤부터 작성해 주면 된다.

만약 Java를 만들 때 라이브러리들을 import를 하지 않고 그냥 만들었다면 여기에서 해결이 될 것이다. 하지만 그렇지 않았다면 jar를 실행했을 때 라이브러리 class를 찾지 못해 오류가 발생할 것이다...

이것을 해결하는 방법은 직접 라이브러리들을 추가시켜 주거나 추가 플러그인을 사용하는 것이다.

나는 플러그인을 추가하여 해결해 보도록 하겠다.

 

ShadowJar 플러그인 

https://imperceptiblethoughts.com/shadow/introduction/#benefits-of-shadow

 

Introduction

Introduction Shadow is a Gradle plugin for combining a project's dependency classes and resources into a single output Jar. The combined Jar is often referred to a fat-jar or uber-jar. Shadow utilizes JarInputStream(opens new window) and JarOutputStream(op

imperceptiblethoughts.com

Shadow is a Gradle plugin for combining a project's dependency classes and resources into a single output Jar. The combined Jar is often referred to a fat-jar or uber-jar. Shadow utilizes JarInputStream and JarOutputStream to efficiently process dependent libraries into the output jar without incurring the I/O overhead of expanding the jars to disk.
=> Shadow는 프로젝트의 의존성 클래스와 리소스를 하나의 출력 Jar로 결합하기 위한 Gradle 플러그인입니다. 결합된 Jar는 종종 fat-jar 또는 uber-jar라고 합니다. Shadow는 JarInputStream과 JarOutputStream을 활용하여 종속 라이브러리를 디스크로 확장하는 I/O 오버헤드를 발생시키지 않고 출력 Jar로 효율적으로 처리합니다.

공식 문서에 있는 설명이다. 간략하게 요약하자면 묶여있는 의존성들을 하나의 Jar로 결합하기 위해서 사용하는 Gradle 플러그인이다. (이러한 결합된 Jar를 fat-jar 혹은 uber-jar라고 부른다.)

 

즉, 이를 사용해서 기존에 발생하던 라이브러리가 함께 빌드되지 않던 오류를 해결할 수 있게 된다!

 

사용 방법은 매우 간단하다 ㅎㅎ

 

build.gradle 파일에

plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '6.1.0' // 추가한 코드
}

jar {
    finalizedBy shadowJar // 추가한 코드

    manifest {
        attributes 'Main-Class': 'Main 클래스 경로'
    }
}
  • 아래 두줄을 각각 plugins와 jar에 넣어주면 된다.
    • id 'com.github.johnrengelman.shadow' version '6.1.0'를 plugins에
    • finalizedBy shadowJar를 jar에 넣어주면 된다.
  • 이때 주의해야 할 점이 있는데 그래들의 버전에 따라  shadow 플러그인의 버전을 다르게 넣어주어야 한다.
    • Gradle버전 : shadow 버전
    • 5.x 버전: 5.2.0 ~ 6.0.0
    • 6.x 버전: 5.2.0 ~ 6.1.0
    • 7.x 버전: 7.0.0+
    • 8.x 버전: 8.0.0+

설정을 작성해준 뒤 clean ->  build -> jar를 진행해 주면 잘 실행되는 것을 확인할 수 있다!

 

그외 추가 기능들은 https://imperceptiblethoughts.com/shadow/에 방문하면 살펴볼 수 있다.

 

VuePress

 

imperceptiblethoughts.com

 

반응형