- 빌드 툴 플러그인(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)
- 빌드 툴 플러그인(Build Tool Plugins)
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 가 지정되지 않은 경우) |
mainclass | main 클래스 검색 시간을 줄이는 데 사용할 수 있다. | 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 ...
}
}
17.5. 다음에 읽을 내용(What to Read Next)
빌드 도구 플러그인의 작동 방식에 관심이 있다면 깃헙의 spring-boot-tools
모듈을 살펴보자. 실행 가능한 jar 포맷에 대한 자세한 기술 세부 사항은 부록에서 다룬다.
특정 빌드 관련 질문이 있는 경우 “how-to” 가이드를 참고하자.