Skip to content

16. 构建工具插件

Spring Boot 为 Maven 和 Gradle 提供了构建工具插件. 插件提供了多种功能,包括可执行 jar 的打包. 本节提供了有关这两个插件的更多详细信息,以及在扩展不受支持的构建系统时所需的一些帮助. 如果您刚刚入门,则可能需要先阅读 “构建系统” 部分中的 “使用 Spring Boot” .

16.1. Spring Boot Maven 插件

Spring Boot Maven 插件在 Maven 中提供了 Spring Boot 支持,使您可以打包可执行 jar 或 war 归档文件并 “in-place” 运行应用程序. 要使用它,必须使用 Maven 3.2 (或更高版本) .

请参阅插件的文档以了解更多信息:

16.2. Spring Boot Gradle 插件

Spring Boot Gradle 插件在 Gradle 中提供了 Spring Boot 支持,可让您打包可执行 jar 或 war 归档文件,运行 Spring Boot 应用程序以及使用所提供的依赖管理 spring-boot-dependencies. 它需要 6.8, 6.9, 或 7.x: 请参阅插件的文档以了解更多信息:

16.3. Spring Boot AntLib 模块

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

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

您需要记住使用该 -lib 选项启动 Ant ,如以下示例所示:

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

TIP

使用 Spring Boot 部分包含将 Apache Ant 与结合 使用 spring-boot-antlib 的更完整示例.

16.3.1. Spring Boot Ant 任务

一旦 spring-boot-antlib 命名空间已申报,以下附加任务:

使用 “exejar” Task

您可以使用该 exejar 任务创建一个 Spring Boot 可执行 jar. 任务支持以下属性:

属性描述是否需要
destfile要创建的目标 jar 文件Yes
classesJava 类文件的根目录Yes
start-class要运行的主要应用程序类No (否 (默认为找到的第一个声明 main 方法的类) )

以下嵌套元素可用于任务:

元素描述
resources一个或多个 资源集合,描述应添加到创建的 jar 文件内容中的一组 Resources .
lib应将一个或多个 资源集合 添加到组成应用程序运行时依赖类路径的 jar 库集合中.
例子

本节显示了两个 Ant 任务示例.

Specify start-class

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

Detect start-class

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

16.3.2. 使用 “findmainclass” Task

该 findmainclass 任务在内部 exejar 用于查找声明的类 main. 如有必要,您也可以在构建中直接使用此任务. 支持以下属性:

属性描述是否需要
classesrootJava 类文件的根目录Yes (除非 mainclass 指定)
mainclass可用于短路 main class 搜索No
property应该与结果一起设置的Ant属性No (如果未指定,将记录结果)
例子

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

Find and log

xml
<findmainclass classesroot="target/classes" />

Find and set

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

Override and set

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

16.4. 支持其他构建系统

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

Spring Boot Maven 和 Gradle 插件都利用它们 spring-boot-loader-tools 来生成 jar. 如果需要,可以直接使用此库.

16.4.1. 重新打包 Archives

要重新打包现有构件,使其成为独立的可执行构件,请使用 org.springframework.boot.loader.tools.Repackager. 该 Repackager class 采取的是指现有的 jar 或 war archive 单个构造函数的参数. 使用两种可用 repackage() 方法之一替换原始文件或写入新目标. 在重新打包程序运行之前,还可以对其进行各种设置.

16.4.2. 嵌套库

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

如果归档文件中已经包含库,则可以使用 Libraries.NONE.

16.4.3. 查找 Main Class

如果您不用于 Repackager.setMainClass() 指定主类,则重新包装器将使用 ASM 读取类文件,并尝试使用一种 public static void main(String[] args) 方法找到合适的类. 如果找到多个候选者,则会引发异常.

16.4.4. 重新打包示例实现

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

java
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 ...    
	}
}

16.5. 接下来阅读什么

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

如果您有与构建相关的特定问题,可以查看 “how-to” 指南.