원문 - Build Tool Plugins


    1. 빌드 툴 플러그인(Build Tool Plugins)
      • 17.1. 스프링 부트 메이븐 플러그인(Spring Boot Maven Plugin)
      • 17.2. 스프링 부트 그레이들 플러그인(Spring Boot Gradle Plugin)
      • 17.3. 스프링 부트 앤드Lib 모듈(Spring Boot AntLib Module)
        • 17.3.1. 스프링 부트 앤트 태스크(Spring Boot Ant Tasks)
      • exejar 태스크 사용(Using the “exejar” Task)
      • 예제(Examples) - 17.3.2. findmainclass 태스크 사용(Using the “findmainclass” Task)
      • 예제(Examples) - 17.4. 다른 빌드 시스템 지원(Supporting Other Build Systems) - 17.4.1. 리패키징 압축파일(Repackaging Archives) - 17.4.2. 중첩된 라이브러리(Nested Libraries) - 17.4.3. 메인 클래스 찾기(Finding a Main Class) - 17.4.4. 리패키지 구현 예제(Example Repackage Implementation) - 17.5. 다음에 읽을 내용(What to Read Next)

17. 빌드 툴 플러그인(Build Tool Plugins)

스프링 부트는 메이븐 및 그레이들용 빌드 도구 플러그인을 제공한다. 플러그인은 실행 가능한 jar 패키징을 포함하여 다양한 기능을 제공한다. 이 장에서는 두 플러그인에 대한 자세한 내용과 지원되지 않는 빌드 시스템을 확장하는 데 필요한 몇 가지 도움말을 제공한다. 이제 막 시작했다면 “스프링 부트로 개발하기(Developing with Spring Boot)” 장“빌드 시스템(Build Systems)”을 먼저 읽어보자.

17.1. 스프링 부트 메이븐 플러그인(Spring Boot Maven Plugin)

스프링 부트 메이븐 플러그인은 메이븐에서 스프링 부트 지원을 제공하여 실행 가능한 jar 또는 war 압축파일을 패키지하고 애플리케이션을 “즉시” 실행할 수 있게 해준다. 이를 사용하려면 메이븐 3.6.3 이상을 사용해야 한다.

자세한 내용은 플러그인 설명서를 참고하자.

17.2. 스프링 부트 그레이들 플러그인(Spring Boot Gradle Plugin)

스프링 부트 그레이들 플러그인은 그레이들에서 스프링 부트 지원을 제공하여 실행 가능한 jar 또는 war 압축파일를 패키징하고, 스프링 부트 애플리케이션을 실행하고, spring-boot-dependent에서 제공하는 의존성 관리를 사용할 수 있게 해줍니다. 그레이들 7.x(7.5 이상) 또는 8.x가 필요하다. 자세한 내용은 플러그인 설명서를 참고하자.

17.3. 스프링 부트 AntLib 모듈(Spring Boot AntLib Module)

스프링 부트 AntLib 모듈은 아파치 앤트에 대한 기본 스프링 부트 지원을 제공한다. 모듈을 사용하여 실행 가능한 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>

다음 예제와 같이 -lib 옵션을 사용하여 앤트를 시작해야 한다는 점을 기억해야 한다.

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

“스프링 부트 사용” 장에는 spring-boot-antlib와 함께 아파치 앤트를 사용하는 보다 완전한 예제가 포함되어 있다.

17.3.1. 스프링 부트 앤트 태스크(Spring Boot Ant Tasks)

spring-boot-antlib 네임스페이스가 선언되면 다음과 같은 추가 태스크를 사용할 수 있다.

  • “exejar” 태스크 사용
  • “findmainclass” 태스크 사용

exejar 태스크 사용(Using the “exejar” Task)

exejar 태스크를 사용하여 스프링 부트의 실행 가능 jar을 생성할 수 있다. 태스크에서 다음 프로퍼티를 지원한다.

애트리뷰트설명필수
destfile생성할 대상 jar 파일Yes
classes자바 클래스 파일의 루트 디렉토리Yes
start-class실행할 메인 애플리케이션 클래스No (기본값은 ‘main’ 메서드를 선언하는 첫 번째 클래스다)

다음과 같은 중첩 엘리먼트를 태스크에 사용할 수 있다.

엘리먼트설명
resources생성된 jar 파일의 내용에 추가되어야 하는 리소스를 설명하는 하나 이상의 리소스 컬렉션이다.
lib애플리케이션의 런타임 의존성 클래스 패스를 구성하는 jar 라이브러리 세트에 추가되어야 하는 하나 이상의 리소스 컬렉션이다.

예제(Examples)

이 절에서는 앤트 태스크의 두 가지 예제를 보여준다.

시작클래스 지정

<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>

시작클래스 발견

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

17.3.2. findmainclass 태스크 사용(Using the “findmainclass” Task)

findmainclass 태스크는 main을 선언하는 클래스를 찾기 위해 exejar에 의해 내부적으로 사용된다. 필요한 경우 빌드에서 직접 이 태스크을 사용할 수도 있다. 다음 애트리뷰트가 지원된다.

애트리뷰트설명필수
classesroot자바 클래스 파일의 루트 디렉토리YES(mainclass가 지정되지 않은 경우)
mainclassmain 클래스 검색 시간을 줄이는 데 사용할 수 있다.NO
property결과와 함께 설정되어야 하는 앤트 프로퍼티No (지정되지 않은 경우 결과가 기록됨)

예제(Examples)

이 절에서는 findmainclass 사용에 대한 세 가지 예제가 포함되어 있다.

찾기 및 기록

<findmainclass classesroot="target/classes" />

찾기 및 설정

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

오버라이드 및 설정

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

17.4. 다른 빌드 시스템 지원(Supporting Other Build Systems)

메이븐, 그레이들 또는 앤트 이외의 빌드 도구를 사용하려면 자체 플러그인을 개발해야 할 수도 있다. 실행 가능한 jar는 특정 포맷을 따라야 하며 특정 항목은 압축되지 않은 형식으로 작성되어야 한다(자세한 내용은 부록의 “실행 가능한 jar 포맷” 장을 참고).

스프링 부트 메이븐 및 그레이들 플러그인은 모두 spring-boot-loader-tools를 사용하여 실제로 jar를 생성한다. 필요한 경우 이 라이브러리를 직접 사용할 수 있다.

17.4.1. 리패키징 압축파일(Repackaging Archives)

기존 압축파일을 실행 가능한 압축파일이 되도록 다시 패키지하려면 org.springframework.boot.loader.tools.Repackager를 사용하자. Repackager 클래스는 기존 jar 또는 war 압축파일을 참조하는 단일 생성자 아규먼트를 사용한다. 사용 가능한 두 가지 repackage() 메서드 중 하나를 사용하여 원본 파일을 바꾸거나 새 대상에 쓴다. Repackager를 실행하기 전 다양한 설정을 구성할 수도 있다.

17.4.2. 중첩된 라이브러리(Nested Libraries)

압축파일을 재패키징할 때 org.springframework.boot.loader.tools.Libraries 인터페이스를 사용하여 의존성 파일에 대한 레퍼런스를 포함할 수 있다. 일반적으로 빌드 시스템마다 다르므로 여기서는 구체적인 라이브러리 구현체을 제공하지 않는다.

압축파일에 이미 라이브러리가 포함된 경우 Libraries.NONE을 사용할 수 있다.

17.4.3. 메인 클래스 찾기(Finding a Main Class)

메인 클래스를 지정하기 위해 Repackager.setMainClass()를 사용하지 않는 경우, 리패키저는 ASM을 사용하여 클래스 파일을 읽고 public static void main(String[] args) 메소드를 사용하여 적합한 클래스를 찾으려고 시도한다. 둘 이상의 후보가 발견되면 예외가 발생한다.

17.4.4. 리패키지 구현 예제(Example Repackage Implementation)

다음 예제에서는 일반적인 리패키지 구현을 보여준다.

자바

import java.io.File;
import java.io.IOException;
import java.util.List;
import org.springframework.boot.loader.tools.Library;
import org.springframework.boot.loader.tools.LibraryCallback;
import org.springframework.boot.loader.tools.LibraryScope;
import org.springframework.boot.loader.tools.Repackager;

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 {
    // 시스템별 구현 빌드, 각 의존성에 대한 콜백
    for (File nestedJar : getCompileScopeJars()) {
      callback.library(new Library(nestedJar, LibraryScope.COMPILE));
    }
    // ... 
  }
  private List<File> getCompileScopeJars() {
    return ...
  } 
}

코틀린

import org.springframework.boot.loader.tools.Library
import org.springframework.boot.loader.tools.LibraryCallback
import org.springframework.boot.loader.tools.LibraryScope
import org.springframework.boot.loader.tools.Repackager
import java.io.File
import java.io.IOException

class MyBuildTool {
  @Throws(IOException::class)
  fun build() {
    val sourceJarFile: File? =  ...
    val repackager = Repackager(sourceJarFile)
    repackager.setBackupSource(false)
    repackager.repackage { callback: LibraryCallback -> getLibraries(callback) }
  }
    
  @Throws(IOException::class)
  private fun getLibraries(callback: LibraryCallback) {
    // 시스템별 구현 빌드, 각 의존성에 대한 콜백
    for (nestedJar in getCompileScopeJars()!!) {
      callback.library(Library(nestedJar, LibraryScope.COMPILE))
    }

    // ... 
  }

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

빌드 도구 플러그인의 작동 방식에 관심이 있다면 깃헙의 spring-boot-tools 모듈을 살펴보자. 실행 가능한 jar 포맷에 대한 자세한 기술 세부 사항은 부록에서 다룬다.

특정 빌드 관련 질문이 있는 경우 “how-to” 가이드를 참고하자.