토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

스프링 부트 공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.

목차


스프링 부트는 메이븐과 그래들을 위한 빌드 툴 플러그인을 제공한다. 플러그인에선 실행 가능한executable jar 패키징을 포함한 다양한 기능들을 제공한다. 이번 섹션에선 이 두 가지 플러그인을 자세히 살펴보고, 지원되지 않는 빌드 시스템을 확장할 때 필요한 몇 가지 팁을 제공한다. 스프링 부트를 이제 막 시작했다면 “스프링 부트로 애플리케이션 개발하기” 섹션에서 “빌드 시스템”을 먼저 읽어보고 오는 게 좋다.


11.1. Spring Boot Maven Plugin

스프링 부트 메이븐 플러그인은 메이븐으로 스프링 부트 애플리케이션을 개발하는 것을 도와준다. 덕분에 실행 가능한executable jar나 war 아카이브를 패키징하고, 애플리케이션을 “그 자리에서” 바로 실행할 수 있다. 이 플러그인을 이용하려면 메이븐 3.2 이상이 필요하다.

좀 더 자세히 알아보려면 플러그인의 문서를 참고해라:


11.2. Spring Boot Gradle Plugin

스프링 부트 그래들 플러그인은 그래들로 스프링 부트 애플리케이션을 개발하는 것을 도와준다. 덕분에 실행 가능한executable jar나 war 아카이브를 패키징하고, 스프링 부트 애플리케이션을 실행하고, spring-boot-dependencies에서 제공하는 의존성 관리를 이용할 수 있다. 이 플러그인을 사용하려면 그래들 6.8이나, 6.9, 7.x가 필요하다. 좀 더 자세히 알아보려면 플러그인의 문서를 참고해라:


11.3. Spring Boot AntLib Module

스프링 부트 AntLib 모듈은 Apache Ant를 위한 기본적인 스프링 부트 기능을 제공한다. 이 모듈을 사용하면 실행 가능한executable jar를 생성할 수 있다. 모듈을 사용하려면 아래 예제처럼 build.xml에 별도 spring-boot 네임스페이스를 선언해야 한다:

<project xmlns:ivy="antlib:org.apache.ivy.ant"
    xmlns:spring-boot="antlib:org.springframework.boot.ant"
    name="myapp" default="build">
    ...
</project>

Ant를 시작할 땐 아래와 같이 -lib 옵션을 사용하는 걸 잊지 마라:

$ ant -lib <directory containing spring-boot-antlib-2.5.2.jar>

“스프링 부트 사용하기” 섹션에선 spring-boot-antlib로 Apache Ant를 사용하는 좀 더 완전한 예제를 제공하고 있다.

11.3.1. Spring Boot Ant Tasks

spring-boot-antlib 네임스페이스를 선언해줬다면 아래와 같은 태스크를 추가로 사용할 수 있다:

Using the “exejar” Task

exejar 태스크를 사용해서 스프링 부트의 실행 가능한executable jar를 생성할 수 있다. 이 태스크에선 다음과 같은 속성들을 지원한다:

Attribute Description Required
destfile 생성할 jar 파일 Yes
classes 자바 클래스 파일들의 루트 디렉토리 Yes
start-class 실행할 메인 애플리케이션 클래스 No (디폴트는 첫 번째로 발견한 main 메소드를 선언한 클래스다)

이 태스크 안에는 아래와 같은 요소들을 사용할 수 있다:

Element Description
resources 만들어지는 jar 파일 컨텐츠에 추가해야 하는 리소스 셋을 나타내는 하나 이상의 리소스 컬렉션.
lib 애플리케이션의 런타임 의존성 클래스패스를 구성하는 jar 라이브러리 셋에 추가해야 하는 하나 이상의 리소스 컬렉션.

Examples

여기서는 두 가지 Ant 태스크 예시를 보여준다.

Specify start-class

<spring-boot:exejar destfile="target/my-application.jar"
        classes="target/classes" start-class="com.example.MyApplication">
    <resources>
        <fileset dir="src/main/resources" />
    </resources>
    <lib>
        <fileset dir="lib" />
    </lib>
</spring-boot:exejar>

Detect start-class

<exejar destfile="target/my-application.jar" classes="target/classes">
    <lib>
        <fileset dir="lib" />
    </lib>
</exejar>

11.3.2. Using the “findmainclass” Task

findmainclass 태스크는 exejar에서 내부적으로 main을 선언하고 있는 클래스를 찾을 때 사용하는 태스크다. 필요하다면 이 태스크를 빌드에서 직접 사용하는 것도 가능하다. 다음과 같은 속성들을 지원한다:

Attribute Description Required
classesroot 자바 클래스 파일들의 루트 디렉토리 Yes (mainclass를 지정하지 않았을 때만)
mainclass main 클래스를 검색하는 대신 바로 지정한다 No
property 결과를 세팅해줄 Ant 프로퍼티 No (지정하지 않으면 결과를 로깅한다)

Examples

여기서는 findmainclass를 사용하는 세 가지 예시를 보여준다.

Find and log

<findmainclass classesroot="target/classes" />

Find and set

<findmainclass classesroot="target/classes" property="main-class" />

Override and set

<findmainclass mainclass="com.example.MainClass" property="main-class" />

11.4. Supporting Other Build Systems

메이븐이나 그래들, Ant 이외 다른 빌드 툴을 사용하려면 대개는 자체 플러그인을 개발해야 할 거다. 실행 가능한executable jar는 정해진 형식을 지켜야 하며, 압축하지 않은 포맷으로 작성해야 하는 항목들도 있다 (자세한 내용은 부록에 있는 “executable jar 포맷” 섹션 참고).

스프링 부트 메이븐, 그래들 플러그인은 실제 jar를 생성할 땐 둘 다 spring-boot-loader-tools를 사용한다. 필요하다면 이 라이브러리를 직접 사용해도 된다.

11.4.1. Repackaging Archives

기존 아카이브를 자립적으로 실행할 수 있는self-contained 실행 아카이브로 다시 패키징하려면 org.springframework.boot.loader.tools.Repackager를 사용해라. Repackager 클래스 생성자에선 기존 jar나 war 아카이브를 참조하는 단일 인자를 받는다. 이 클래스에 있는 두 가지 repackage() 메소드 중 하나를 사용해서 원본 파일을 교체하거나 새 경로에 파일을 생성해라. repackager를 실행하기 전에 변경할 수 있는 다양한 설정들도 지원한다.

11.4.2. Nested Libraries

아카이브를 다시 패키징할 때는 org.springframework.boot.loader.tools.Libraries 인터페이스를 사용해서 의존성 파일에 대한 참조를 포함시킬 수 있다. Libraries 구현체는 보통 빌드 시스템마다 다르기 때문에, 실제 구현체는 따로 제공하지 않는다.

아카이브에 이미 라이브러리들이 들어있다면 Libraries.NONE을 사용하면 된다.

11.4.3. Finding a Main Class

Repackager.setMainClass()로 메인 클래스를 지정하지 않았다면, repackager는 ASM을 사용해서 클래스 파일들을 읽어 public static void main(String[] args) 메소드를 가지고 있는 클래스를 찾아본다. 적당한 후보가 둘 이상일 땐 예외를 던진다.

11.4.4. Example Repackage Implementation

다음은 repackage를 구현하는 전형적인 예시다:

public class MyBuildTool {

    public void build() throws IOException {
        File sourceJarFile = ...
        Repackager repackager = new Repackager(sourceJarFile);
        repackager.setBackupSource(false);
        repackager.repackage(this::getLibraries);
    }

    private void getLibraries(LibraryCallback callback) throws IOException {
        // Build system specific implementation, callback for each dependency
        for (File nestedJar : getCompileScopeJars()) {
            callback.library(new Library(nestedJar, LibraryScope.COMPILE));
        }
        // ...
    }

    private List<File> getCompileScopeJars() {
        return ...
    }

}

빌드 툴 플러그인의 동작 방식에 관심이 있다면 깃허브에서 spring-boot-tools 모듈을 찾아보면 된다. 실행 가능한executable jar 포맷에 대한 자세한 기술적인 정보는 부록에서 다루고 있다.

빌드와 관련해서 따로 궁금한게 있다면 “how-to” 가이드를 확인해보면 된다.


전체 목차는 여기에 있습니다.

<< >>

TOP