Spring Boot 为 Maven 和 Gradle 提供了构建工具插件. 插件提供了多种功能,包括可执行jar的打包. 本节提供了有关这两个插件的更多详细信息,以及在扩展不受支持的构建系统时所需的一些帮助. 如果您刚刚入门,则可能需要先阅读 “using-spring-boot.html” 部分中的 “using-spring-boot.html”.
1. Spring Boot Maven 插件
Spring Boot Maven 插件在 Maven 中提供了 Spring Boot 支持,使您可以打包可执行 jar 或 war 归档文件并 “in-place” 运行应用程序. 要使用它,必须使用Maven 3.2 (或更高版本) .
请参阅 Spring Boot Maven 插件网站]以获取完整的插件文档. |
1.1. 导入插件
要使用 Spring Boot Maven 插件,请在 pom.xml
的 plugins
部分中包含适当的XML,如以下示例所示:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- ... -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.5.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
前面的配置将在Maven生命周期的 package
阶段中构建的jar或war重新打包. 下面的示例在 target
目录中显示了重新打包的jar和原始jar:
$ mvn package $ ls target/*.jar target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
如上例所示,如果不包括 <execution/>
配置,则可以单独运行插件 (但也必须同时使用软件包目标) ,如以下示例所示:
$ mvn package spring-boot:repackage $ ls target/*.jar target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
如果使用里程碑或快照版本,则还需要添加适当的 pluginRepository
元素,如以下清单所示:
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>https://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
1.2. 打包可执行的Jar和War文件
一旦您的 pom.xml
中包含了 spring-boot-maven-plugin
,它就会使用 spring-boot:repackage
目标自动尝试重写存档以使其可执行. 您应该使用通常的 packaging
元素将您的项目配置为构建jar或war (适当时) ,如以下示例所示:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- ... -->
<packaging>jar</packaging>
<!-- ... -->
</project>
在 package
阶段,Spring Boot会增强您现有的存档. 您可以通过使用配置选项 (如下所示) 或将 Main-Class
属性添加到清单中来指定要启动的主类. 如果您未指定主类,则插件将使用 public static void main(String[] args)
方法搜索一个类.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.app.Main</mainClass>
</configuration>
</plugin>
要构建和运行项目工件,可以输入以下内容:
$ mvn package $ java -jar target/mymodule-0.0.1-SNAPSHOT.jar
要构建一个既可执行又可部署到外部容器的war文件,您需要将嵌入式容器的依赖关系标记为 “provided”,如以下示例所示:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- ... -->
<packaging>war</packaging>
<!-- ... -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- ... -->
</dependencies>
</project>
有关如何创建可部署的war文件的更多详细信息,请参见 "`howto.html`"部分. |
plugin info page中提供了高级配置选项和示例.
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 <folder containing spring-boot-antlib-2.2.5.RELEASE.jar>
使用Spring Boot 部分包含将Apache Ant与结合使用 spring-boot-antlib 的更完整示例.
|
3.1. Spring Boot Ant 任务
一旦 spring-boot-antlib
命名空间已申报,以下附加任务:
3.1.1. spring-boot:exejar
您可以使用该 exejar
任务创建一个Spring Boot可执行jar. 任务支持以下属性:
属性 | 描述 | 是否需要 |
---|---|---|
|
要创建的目标jar文件 |
Yes |
|
Java类文件的根目录 |
Yes |
|
要运行的主要应用程序类 |
No (否 (默认为找到的第一个声明 |
以下嵌套元素可用于任务:
元素 | 描述 |
---|---|
|
|
|
应将一个或多个 资源集合 添加到组成应用程序运行时依赖类路径的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>
4. 支持其他构建系统
如果要使用Maven,Gradle或Ant以外的构建工具,则可能需要开发自己的插件. 可执行的jar需要遵循特定的格式,某些条目需要以未压缩的形式编写 (有关详细信息,请参见附录中的 “可执行jar格式” 部分) .
Spring Boot Maven和Gradle插件都利用它们 spring-boot-loader-tools
来实际生成jar. 如果需要,可以直接使用此库.
4.1. 重新打包 Archives
要重新打包现有存档,使其成为独立的可执行存档,请使用 org.springframework.boot.loader.tools.Repackager
. 该 Repackager
class 采取的是指现有的 jar 或 war archive 单个构造函数的参数.
使用两种可用 repackage()
方法之一替换原始文件或写入新目标. 在重新打包程序运行之前,还可以对其进行各种设置.
4.2. 嵌套库
重新打包 存档 时,可以使用该 org.springframework.boot.loader.tools.Libraries
接口包括对依赖文件的引用. 我们 Libraries
这里不提供任何具体的实现,因为它们通常是特定于构建系统的.
如果归档文件中已经包含库,则可以使用 Libraries.NONE
.
4.3. 查找 Main Class
如果您不用于 Repackager.setMainClass()
指定主类,则重新包装器将使用 ASM 读取类文件,并尝试使用一种 public static void main(String[] args)
方法找到合适的类. 如果找到多个候选者,则会引发异常.
4.4. 重新打包示例实现
以下示例显示了典型的重新打包实现:
Repackager repackager = new Repackager(sourceJarFile);
repackager.setBackupSource(false);
repackager.repackage(new Libraries() {
@Override
public void doWithLibraries(LibraryCallback callback) throws IOException {
// Build system specific implementation, callback for each dependency
// callback.library(new Library(nestedFile, LibraryScope.COMPILE));
}
});
5. 接下来阅读什么
如果您对构建工具插件的工作方式感兴趣,可以查看 spring-boot-tools
上的模块. 可执行jar格式的更多技术细节在 附录中 介绍.
如果您有与构建相关的特定问题,可以查看 “how-to” 指南.