Spring Boot提供了用于Maven和Gradle的构建工具插件。这些插件提供了各种功能,包括打包可执行的jar文件。本节详细介绍了这两个插件,以及在需要扩展不受支持的构建系统时提供的一些帮助。如果您刚开始使用,您可能希望先阅读“using.html”部分中的内容。

1. Spring Boot Maven插件

Spring Boot Maven插件在Maven中提供了Spring Boot支持,允许您打包可执行的jar或war存档,并在原地运行应用程序。要使用它,您必须使用Maven 3.6.3或更高版本。

查看插件的文档以了解更多信息:

2. Spring Boot Gradle插件

Spring Boot Gradle插件在Gradle中提供了Spring Boot支持,允许您打包可执行的jar或war存档,运行Spring Boot应用程序,并使用spring-boot-dependencies提供的依赖管理。它需要Gradle 7.x(7.5或更高版本)或8.x。查看插件的文档以了解更多信息:

3. Spring Boot AntLib 模块

Spring Boot AntLib 模块为 Apache Ant 提供基本的 Spring Boot 支持。您可以使用该模块创建可执行的 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,如下例所示:

$ ant -lib <包含 spring-boot-antlib-3.2.3.jar 的目录>
“使用 Spring Boot”部分包含了一个更完整的示例,展示了如何使用 Apache Ant 与 spring-boot-antlib

3.1. Spring Boot Ant 任务

一旦声明了 spring-boot-antlib 命名空间,将会提供以下额外的任务:

3.1.1. 使用 “exejar” 任务

您可以使用 exejar 任务创建一个 Spring Boot 可执行 JAR 文件。该任务支持以下属性:

属性 描述 必需

destfile

要创建的目标 JAR 文件

classes

Java 类文件的根目录

start-class

要运行的主应用程序类

(默认为第一个声明了 main 方法的类)

以下嵌套元素可与该任务一起使用:

元素 描述

resources

一个或多个描述应添加到创建的 JAR 文件内容中的资源集合资源描述。

lib

一个或多个应添加到应用程序运行时依赖类路径组成的 JAR 库集合的资源集合

3.1.2. 示例

本节展示了两个 Ant 任务的示例。

指定 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>
检测 start-class
<exejar destfile="target/my-application.jar" classes="target/classes">
    <lib>
        <fileset dir="lib" />
    </lib>
</exejar>

3.2. 使用 “findmainclass” 任务

findmainclass 任务在内部被 exejar 使用来定位声明了 main 的类。如果需要,您也可以直接在构建中使用该任务。支持以下属性:

属性 描述 必需

classesroot

Java 类文件的根目录

(除非指定了 mainclass)

mainclass

可用于绕过 main 类搜索

property

应设置结果的 Ant 属性

(如果未指定,结果将被记录)

3.2.1. 示例

本节包含了三个使用 findmainclass 的示例。

查找并记录
<findmainclass classesroot="target/classes" />
查找并设置
<findmainclass classesroot="target/classes" property="main-class" />
覆盖并设置
<findmainclass mainclass="com.example.MainClass" property="main-class" />

4. 支持其他构建系统

如果您想使用除Maven、Gradle或Ant之外的构建工具,您可能需要开发自己的插件。可执行的jar文件需要遵循特定的格式,并且某些条目需要以未压缩的形式编写(详细信息请参见附录中的“可执行jar格式”部分)。

Spring Boot的Maven和Gradle插件都使用了spring-boot-loader-tools来实际生成jar文件。如果需要,您可以直接使用这个库。

4.1. 重新打包存档文件

要重新打包现有存档文件,使其成为一个自包含的可执行存档文件,请使用org.springframework.boot.loader.tools.RepackagerRepackager类接受一个指向现有jar或war存档文件的构造函数参数。在运行之前,可以在重新打包程序上配置各种设置。

4.2. 嵌套库

在重新打包存档文件时,您可以使用org.springframework.boot.loader.tools.Libraries接口来包含对依赖文件的引用。我们这里没有提供任何Libraries的具体实现,因为它们通常是特定于构建系统的。

如果您的存档文件已经包含库,则可以使用Libraries.NONE

4.3. 查找主类

如果您没有使用Repackager.setMainClass()来指定主类,重新打包程序将使用ASM来读取类文件,并尝试找到一个具有public static void main(String[] args)方法的合适类。如果找到多个候选项,则会抛出异常。

4.4. 示例重新打包实现

以下示例显示了一个典型的重新打包实现:

Java
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 {
        // Build system specific implementation, callback for each dependency
        for (File nestedJar : getCompileScopeJars()) {
            callback.library(new Library(nestedJar, LibraryScope.COMPILE));
        }
        // ...
    }

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

}
Kotlin
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) {
        // Build system specific implementation, callback for each dependency
        for (nestedJar in getCompileScopeJars()!!) {
            callback.library(Library(nestedJar, LibraryScope.COMPILE))
        }
        // ...
    }

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

}

5. 接下来阅读什么

如果您对构建工具插件的工作原理感兴趣,可以查看GitHub上的spring-boot-tools模块。关于可执行jar格式的更多技术细节在附录中有详细介绍。

如果您有特定的与构建相关的问题,请参阅“how-to”指南。