Appearance
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 |
classes | Java 类文件的根目录 | 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
. 如有必要,您也可以在构建中直接使用此任务. 支持以下属性:
属性 | 描述 | 是否需要 |
---|---|---|
classesroot | Java 类文件的根目录 | 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” 指南.