本文为官方文档直译版本。原文链接
Spring Boot 为 Maven 和 Gradle 提供了构建工具插件。这些插件提供多种功能,包括打包可执行 jar。本节将提供有关这两个插件的更多详细信息,并在您需要扩展不支持的构建系统时提供一些帮助。如果你刚刚入门,不妨先阅读 “using.html” 部分的 “using.html”。
Spring Boot Maven Plugin 在 Maven 中提供 Spring Boot 支持,让您可以打包可执行 jar 或 war 存档并 “就地” 运行应用程序。要使用该插件,您必须使用 Maven 3.6.3 或更高版本。
如需了解更多信息,请参阅插件文档:
Spring Boot Gradle Plugin 在 Gradle 中提供对 Spring Boot 的支持,让你可以打包可执行的 jar 或 war 归档,运行 Spring Boot 应用程序,并使用 spring-boot-dependencies
提供的依赖关系管理。它需要 Gradle 7.x (7.5 或更高版本)或 8.x。欲了解更多信息,请参阅插件文档:
Spring Boot AntLib 模块为 Apache Ant 提供基本的 Spring Boot 支持。您可以使用该模块创建可执行 jar。要使用该模块,需要在 build.xml
中声明一个额外的 spring-boot
命名空间,如下例所示:
<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.2.1.jar>
在 “使用 Spring Boot” 一节中,包含了一个将 Apache Ant 与 spring-boot-antlib 结合使用的更完整示例。
一旦声明了 spring-boot-antlib
命名空间,就可以执行以下附加任务:
您可以使用 exejar
任务创建 Spring Boot 可执行 jar。该任务支持以下属性:
属性 | 描述 | 必填 |
---|---|---|
destfile |
要创建的目标 jar 文件 | Yes |
classes |
Java 类文件根目录 | Yes |
start-class |
要运行的主程序类 | No (默认情况是找到的第一个声明了主方法的类) |
以下嵌套元素可与任务一起使用:
元素 | 描述 |
---|---|
resources |
一个或多个资源集,描述了应添加到已创建 jar 文件内容中的一组资源。 |
lib |
一个或多个资源集,应添加到构成应用程序运行时依赖类路径的 jar 库集合中。 |
本节展示两个 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>
exejar
内部使用 findmainclass
任务来查找声明 main
的类。如有必要,您也可以在构建过程中直接使用该任务。支持以下属性:
属性 | 描述 | 必填 |
---|---|---|
classesroot |
Java 类文件根目录 | Yes (除非指定了 _mainclass_ ) |
mainclass |
可用于短路主类搜索 | No |
property |
应根据结果设置的 Ant 属性 | No (如果未指定,结果将被记录) |
本节包含三个使用 findmainclass
的示例。
<findmainclass classesroot="target/classes" />
<findmainclass classesroot="target/classes" property="main-class" />
<findmainclass mainclass="com.example.MainClass" property="main-class" />
如果想使用 Maven、Gradle 或 Ant 以外的构建工具,可能需要开发自己的插件。可执行 jar 需要遵循特定的格式,某些条目需要以未压缩的形式编写(详情请参见附录中的 “可执行 jar 格式” 部分)。
Spring Boot Maven 和 Gradle 插件都使用 spring-boot-loader-tools
来实际生成 jar。如果需要,可以直接使用该库。
要重新打包现有存档,使其成为独立的可执行存档,请使用 org.springframework.boot.loader.tools.Repackager
。Repackager
类需要一个构造函数参数,该参数指向现有的 jar 或 war 压缩包。使用两个可用的 repackage()
方法之一替换原始文件或写入新目标。在运行 Repackager
之前,还可以对其进行各种设置。
重新打包归档文件时,您可以使用 org.springframework.boot.loader.tools.Libraries
接口来引用依赖文件。我们在此不提供任何 Libraries
的具体实现,因为它们通常是特定于构建系统的。
如果您的存档已包含库,您可以使用 Libraries.NONE
。
如果不使用 Repackager.setMainClass()
指定主类,重新打包程序会使用 ASM 读取类文件,并尝试使用 public static void main(String[] args)
方法查找合适的类。如果找到的候选类超过一个,就会出现异常。
下面的示例展示了一个典型的重新打包实现过程:
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 ...
}
}