Spring Boot 为 Maven 和 Gradle 提供构建工具插件。这些插件提供了多种功能,包括可执行 jar 的打包。本节提供了有关这两个插件的更多详细信息,以及在您需要扩展不受支持的构建系统时的一些帮助。如果您刚刚开始,您可能需要先阅读“ using.html ”部分中的“ using.html ” 。
3. Spring Boot AntLib模块
Spring Boot AntLib 模块为 Apache Ant 提供基本的 Spring Boot 支持。您可以使用该模块创建可执行 jar。要使用该模块,您需要spring-boot在 中声明一个额外的命名空间build.xml,如以下示例所示:
<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 <directory containing spring-boot-antlib-3.1.5.jar>| “使用 Spring Boot”部分包含将Apache Ant 与 spring-boot-antlib. | 
3.1. Spring Boot Ant 任务
spring-boot-antlib声明命名空间后,可以执行以下附加任务:
3.1.1. 使用“exejar”任务
您可以使用该exejar任务创建 Spring Boot 可执行 jar。该任务支持以下属性:
| 属性 | 描述 | 必需的 | 
|---|---|---|
| 
 | 要创建的目标 jar 文件 | 是的 | 
| 
 | Java类文件的根目录 | 是的 | 
| 
 | 要运行的主应用程序类 | 否(默认是找到的第一个声明 | 
任务可以使用以下嵌套元素:
| 元素 | 描述 | 
|---|---|
| 
 | |
| 
 | 应添加到一组 jar 库中的一个或多个资源集合,这些库构成应用程序的运行时依赖项类路径。 | 
3.1.2. 例子
本节显示 Ant 任务的两个示例。
<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>4. 支持其他构建系统
如果您想使用 Maven、Gradle 或 Ant 之外的构建工具,您可能需要开发自己的插件。可执行jar需要遵循特定的格式,并且某些条目需要以未压缩的形式编写(有关详细信息,请参阅附录中的“可执行jar格式”部分)。
Spring Boot Maven 和 Gradle 插件都用来spring-boot-loader-tools实际生成 jar。如果需要,可以直接使用这个库。
4.1. 重新包装档案
要重新打包现有存档以使其成为独立的可执行存档,请使用org.springframework.boot.loader.tools.Repackager. 该类Repackager采用单个构造函数参数,该参数引用现有的 jar 或 war 存档。使用两种可用repackage()方法之一替换原始文件或写入新目标。在运行之前,还可以在重新打包程序上配置各种设置。
4.2. 嵌套库
重新打包存档时,您可以使用该org.springframework.boot.loader.tools.Libraries界面包含对依赖项文件的引用。我们在这里不提供任何具体的实现,Libraries因为它们通常是特定于构建系统的。
如果您的存档已包含库,则可以使用Libraries.NONE.
4.3. 寻找主类
如果您不使用Repackager.setMainClass()指定主类,则重新打包器将使用ASM读取类文件并尝试通过public static void main(String[] args)方法查找合适的类。如果找到多个候选者,则会引发异常。
4.4. 重新打包实施示例
以下示例显示了典型的重新打包实现:
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 ...
    }
}
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. 接下来读什么
如果您对构建工具插件的工作原理感兴趣,可以查看spring-boot-toolsGitHub 上的模块。附录中介绍了可执行 jar 格式的更多技术细节。
如果您有与构建相关的具体问题,请参阅“操作方法”指南。