Spring Boot 为 Maven 和 Gradle 提供了构建工具插件。这些插件提供了多种功能,包括可执行 jar 的打包。本节提供有关这两个插件的更多详细信息,以及在您需要扩展不受支持的构建系统时提供的一些帮助。如果您刚刚开始,您可能需要先阅读“ using.html ”部分中的“ using.html ”。
1. Spring Boot Maven 插件
Spring Boot Maven 插件在 Maven 中提供 Spring Boot 支持,让您可以打包可执行 jar 或 war 档案并“就地”运行应用程序。要使用它,您必须使用 Maven 3.2(或更高版本)。
请参阅插件的文档以了解更多信息:
- 参考(HTML和PDF)
- API
2. Spring Boot Gradle 插件
Spring Boot Gradle Plugin 在 Gradle 中提供 Spring Boot 支持,让您可以打包可执行的 jar 或 war 档案,运行 Spring Boot 应用程序,并使用spring-boot-dependencies
. 它需要 Gradle 6.8、6.9 或 7.x。请参阅插件的文档以了解更多信息:
- 参考(HTML和PDF)
- API
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-2.7.5.jar>
3.1Spring Boot Ant 任务
声明命名空间后spring-boot-antlib
,可以使用以下附加任务:
- 使用“exejar”任务
- 使用“findmainclass”任务
3.1.1使用“exejar”任务
您可以使用该exejar
任务来创建 Spring Boot 可执行 jar。任务支持以下属性:
属性 | 描述 | 必需的 |
| 要创建的目标 jar 文件 | 是的 |
| Java类文件的根目录 | 是的 |
| 要运行的主要应用程序类 | 否(默认是找到的第一个声明 |
以下嵌套元素可用于该任务:
元素 | 描述 |
| 一个或多个资源集合,描述应添加到创建的 jar 文件内容中的一组资源。 |
| 应将一个或多个资源集合添加到构成应用程序的运行时依赖类路径的 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>
3.2. 使用“findmainclass”任务
该findmainclass
任务在内部exejar
用于定位一个声明main
. 如有必要,您也可以直接在构建中使用此任务。支持以下属性:
属性 | 描述 | 必需的 |
| Java类文件的根目录 | 是(除非 |
| 可用于短路 | 不 |
| 应使用结果设置的 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.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 {标签:插件,Spring,boot,jar,Boot,使用 From: https://blog.51cto.com/u_15326439/5852055
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 ...
}
}