构建工具插件

1. Spring Boot Maven 插件

Spring Boot Maven 插件在 Maven 中提供 Spring Boot 支持,允许您打包可执行 jar 或 war 存档并“就地”运行应用程序。 要使用它,您必须使用 Maven 3.2(或更高版本)。spring-doc.cn

请参阅插件的文档以了解更多信息:spring-doc.cn

2. Spring Boot Gradle 插件

Spring Boot Gradle 插件在 Gradle 中提供 Spring Boot 支持,允许您打包可执行 jar 或 war 存档,运行 Spring Boot 应用程序,并使用 . 它需要 Gradle 6.8、6.9、7.x 或 8.x。 请参阅插件的文档以了解更多信息:spring-boot-dependenciesspring-doc.cn

3. Spring Boot AntLib 模块

Spring Boot AntLib 模块为 Apache Ant 提供了基本的 Spring Boot 支持。 您可以使用该模块创建可执行 jar。 要使用该模块,您需要在 中声明一个额外的命名空间,如以下示例所示:spring-bootbuild.xmlspring-doc.cn

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

您需要记住使用 option 启动 Ant,如以下示例所示:-libspring-doc.cn

$ ant -lib <directory containing spring-boot-antlib-2.7.18.jar>
“使用 Spring Boot”部分包括将 Apache Ant 与 spring-boot-antlib 一起使用的更完整示例。

3.1. Spring Boot Ant 任务

声明命名空间后,可以使用以下其他任务:spring-boot-antlibspring-doc.cn

3.1.1. 使用 “exejar” 任务

您可以使用该任务创建 Spring Boot 可执行 jar。 该任务支持以下属性:exejarspring-doc.cn

属性 描述 必填

destfilespring-doc.cn

要创建的目标 jar 文件spring-doc.cn

是的spring-doc.cn

classesspring-doc.cn

Java 类文件的根目录spring-doc.cn

是的spring-doc.cn

start-classspring-doc.cn

要运行的主要应用程序类spring-doc.cn

(默认是找到的第一个声明 main 方法的类)spring-doc.cn

以下嵌套元素可用于任务:spring-doc.cn

元素 描述

resourcesspring-doc.cn

一个或多个 Resource Collections,描述应添加到所创建 jar 文件内容的一组 Resourcesspring-doc.cn

libspring-doc.cn

应添加到构成应用程序的运行时依赖项 Classpath 的 jar 库集中的一个或多个 Resource Collectionsspring-doc.cn

3.1.2. 示例

本节介绍 Ant 任务的两个示例。spring-doc.cn

指定 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” 任务

该任务在内部用于查找声明 . 如有必要,您还可以直接在构建中使用此任务。 支持以下属性:findmainclassexejarmainspring-doc.cn

属性 描述 必填

classesrootspring-doc.cn

Java 类文件的根目录spring-doc.cn

(除非指定了 mainclassspring-doc.cn

mainclassspring-doc.cn

可用于短路类搜索mainspring-doc.cn

spring-doc.cn

propertyspring-doc.cn

应使用结果设置的 Ant 属性spring-doc.cn

(如果未指定,将记录结果)spring-doc.cn

3.2.1. 示例

本节包含三个使用 .findmainclassspring-doc.cn

查找和记录
<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-doc.cn

Spring Boot Maven 和 Gradle 插件都用于实际生成 jar。 如果需要,您可以直接使用此库。spring-boot-loader-toolsspring-doc.cn

4.1. 重新打包存档

要重新打包现有存档,使其成为自包含的可执行存档,请使用 。 该类采用一个引用现有 jar 或 war 存档的构造函数参数。 使用两种可用方法之一替换原始文件或写入新目标。 在运行重新打包程序之前,还可以在重新打包程序上配置各种设置。org.springframework.boot.loader.tools.RepackagerRepackagerrepackage()spring-doc.cn

4.2. 嵌套库

重新打包存档时,您可以使用界面包含对依赖项文件的引用。 我们没有提供任何具体的实现,因为它们通常是特定于构建系统的。org.springframework.boot.loader.tools.LibrariesLibrariesspring-doc.cn

如果您的存档已包含库,则可以使用 。Libraries.NONEspring-doc.cn

4.3. 查找主类

如果不用于指定主类,则重新打包程序将使用 ASM 读取类文件,并尝试使用方法查找合适的类。 如果找到多个候选者,则会引发异常。Repackager.setMainClass()public static void main(String[] args)spring-doc.cn

4.4. Repackage 实现示例

以下示例显示了典型的 repackage 实现:spring-doc.cn

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
import kotlin.jvm.Throws

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 格式的更多技术细节。spring-doc.cn

如果您有与构建相关的具体问题,请参阅“操作方法”指南。spring-doc.cn