1、介绍
Spring Boot Maven 插件在Apache Maven 中提供 Spring Boot 支持。它允许您打包可执行的 jar 或 war 档案、运行 Spring Boot 应用程序、生成构建信息并在运行集成测试之前启动您的 Spring Boot 应用程序。
2. 入门
要使用 Spring Boot Maven 插件,请在plugins
您的部分包含适当的 XML pom.xml
,如以下示例所示:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>getting-started</artifactId>
<!-- ... -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
如果您使用里程碑或快照版本,您还需要添加适当的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>
3. 使用插件
Maven 用户可以从spring-boot-starter-parent
项目继承以获得合理的默认值。父项目提供以下功能:
- Java 1.8 作为默认编译器级别。
- UTF-8 源编码。
- 与
-parameters
. - 从
spring-boot-dependencies
POM继承的依赖项管理部分,用于管理公共依赖项的版本。<version>
当在您自己的 POM 中使用这些依赖项时,此依赖项管理允许您省略这些依赖项的标记。 - 具有执行 ID的repackage目标的
repackage
执行。 - 明智的资源过滤。
- 合理的插件配置(Git 提交 ID和shade)。
- 对特定于配置文件的文件(例如,和)进行合理的资源过滤
application.properties
并application.yml
包括在内application-dev.properties
application-dev.yml
3.1. 继承 Starter Parent POM
要将您的项目配置为从 继承spring-boot-starter-parent
,请parent
进行如下设置:
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
</parent>
通过该设置,您还可以通过覆盖自己项目中的属性来覆盖各个依赖项。例如,要使用不同版本的 SLF4J 库和 Spring Data 发布系列,您需要将以下内容添加到您的pom.xml
:
<properties>
<slf4j.version>1.7.30</slf4j.version>
<spring-data-releasetrain.version>Moore-SR6</spring-data-releasetrain.version>
</properties>
3.2. 在没有父 POM 的情况下使用 Spring Boot
您可能有理由不从spring-boot-starter-parent
POM继承。您可能有自己需要使用的公司标准父级,或者您可能更喜欢显式声明所有 Maven 配置。
如果您不想使用spring-boot-starter-parent
,您仍然可以通过使用import
作用域依赖来保持依赖管理(但不是插件管理)的好处,如下所示:
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
前面的示例设置不允许您通过使用属性覆盖各个依赖项,如上所述。要达到相同的结果,您需要在条目之前的dependencyManagement
项目部分中添加条目。例如,要使用不同版本的 SLF4J 库和 Spring Data 发布系列,您可以将以下元素添加到您的:spring-boot-dependencies
pom.xml
<dependencyManagement>
<dependencies>
<!-- Override SLF4J provided by Spring Boot -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>2020.0.0-SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.3. 覆盖命令行上的设置
该插件提供了许多用户属性,以 开头spring-boot
,让您可以从命令行自定义配置。
例如,您可以在运行应用程序时调整配置文件以启用,如下所示:
$ mvn spring-boot:run -Dspring-boot.run.profiles=dev,local
如果您希望在允许在命令行上覆盖它的同时具有默认值,则应结合使用用户提供的项目属性和 MOJO 配置。
<project>
<properties>
<app.profiles>local,dev</app.profiles>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<profiles>${app.profiles}</profiles>
</configuration>
</plugin>
</plugins>
</build>
</project>
以上确保默认情况下启用local
和dev
。现在已经公开了一个专用属性,这也可以在命令行上覆盖:
$ mvn spring-boot:run -Dapp.profiles=test
4. 目标
Spring Boot 插件有以下目标:
目标 | 描述 |
使用 buildpack 将应用程序打包到 OCI 映像中。 | |
| |
显示有关 spring-boot-maven-plugin 的帮助信息。调用 | |
重新打包现有的 JAR 和 WAR 存档,以便可以使用 | |
就地运行应用程序 | |
启动一个 spring 应用程序。与 | |
停止由“开始”目标启动的应用程序。通常在测试套件完成后调用 |
5. 打包可执行文件
该插件可以创建包含应用程序所有依赖项的可执行存档(jar 文件和 war 文件),然后可以使用java -jar
.
打包可执行存档由repackage
目标执行,如以下示例所示:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
如果您正在使用 |
上面的示例重新打包了在 Maven 生命周期的打包阶段构建的一个jar
或war
存档,包括provided
项目中定义的任何依赖项。如果需要排除其中一些依赖项,您可以使用其中一个exclude
选项;有关更多详细信息,请参阅依赖项排除。
.original
默认情况下,原始(即不可执行的)工件被重命名为,但也可以使用自定义分类器保留原始工件。
该 |
默认情况下会自动排除 Devtools(您可以使用该excludeDevtools
属性控制它)。为了使其与war
打包一起工作,spring-boot-devtools
必须将依赖项设置为范围optional
或与provided
范围一起设置。
该插件重写您的清单,特别是它管理Main-Class
和Start-Class
条目。如果默认值不起作用,您必须在 Spring Boot 插件中配置值,而不是在 jar 插件中。所述Main-Class
清单中的由控制layout
所述弹簧引导插件的属性,如显示在下面的例子:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${start.class}</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
该layout
属性默认为由存档类型(jar
或war
)确定的值。可以使用以下布局:
JAR
: 常规的可执行 JAR 布局。WAR
: 可执行的 WAR 布局。provided
放置依赖项WEB-INF/lib-provided
以避免war
在 servlet 容器中部署时发生任何冲突。ZIP
(别名DIR
):类似于JAR
使用的布局PropertiesLauncher
。NONE
:捆绑所有依赖项和项目资源。不捆绑引导加载程序。
5.1. 分层罐或战争
重新打包的 jar分别在BOOT-INF/classes
和 中包含应用程序的类和依赖项BOOT-INF/lib
。同样的,可执行的战争包含了应用程序的类WEB-INF/classes
和依赖关系WEB-INF/lib
和WEB-INF/lib-provided
。对于需要从 jar 或 war 的内容构建 docker 映像的情况,能够进一步分离这些目录以便将它们写入不同的层会很有用。
分层存档使用与常规重新打包的 jar 或 war 相同的布局,但包括一个额外的元数据文件来描述每一层。
默认情况下,定义了以下层:
dependencies
对于任何版本不包含SNAPSHOT
.spring-boot-loader
对于加载器类。snapshot-dependencies
对于任何版本包含SNAPSHOT
.application
用于本地模块依赖项、应用程序类和资源。
通过查看作为当前构建的一部分的所有模块来识别模块依赖关系。如果一个模块依赖只能被解析,因为它已经安装到 Maven 的本地缓存中并且它不是当前构建的一部分,它将被识别为常规依赖。
层顺序很重要,因为它决定了当应用程序的一部分发生更改时可以缓存先前层的可能性。默认顺序是dependencies
, spring-boot-loader
, snapshot-dependencies
, application
。应首先添加最不可能更改的内容,然后添加更可能更改的图层。
重新打包的存档layers.idx
默认包含该文件。要禁用此功能,您可以通过以下方式执行此操作:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>false</enabled>
</layers>
</configuration>
</plugin>
</plugins>
</build>
</project>
[[packaging.layers.configuration=]] === 自定义层配置 根据您的应用程序,您可能想要调整层的创建方式并添加新层。这可以使用一个单独的配置文件来完成,该文件应该如下所示进行注册:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
<configuration>${project.basedir}/src/layers.xml</configuration>
</layers>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置文件描述了档案如何被分成层,以及这些层的顺序。以下示例显示了如何显式定义上述默认排序:
<layers xmlns="http://www.springframework.org/schema/boot/layers"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/boot/layers
https://www.springframework.org/schema/boot/layers/layers-2.5.xsd">
<application>
<into layer="spring-boot-loader">
<include>org/springframework/boot/loader/**</include>
</into>
<into layer="application" />
</application>
<dependencies>
<into layer="application">
<includeModuleDependencies />
</into>
<into layer="snapshot-dependencies">
<include>*:*:*SNAPSHOT</include>
</into>
<into layer="dependencies" />
</dependencies>
<layerOrder>
<layer>dependencies</layer>
<layer>spring-boot-loader</layer>
<layer>snapshot-dependencies</layer>
<layer>application</layer>
</layerOrder>
</layers>
该layers
XML格式在三节中介绍:
- 该
<application>
块定义了应用程序类和资源应如何分层。 - 该
<dependencies>
块定义了依赖项应该如何分层。 - 该
<layerOrder>
块定义了应写入层的顺序。
嵌套<into>
块用于内部<application>
和<dependencies>
部分以声明图层的内容。这些块按照它们定义的顺序从上到下进行评估。先前块未声明的任何内容仍然可供后续块考虑。
该<into>
块使用嵌套<include>
和<exclude>
元素声明内容。该<application>
部分对包含/排除表达式使用 Ant 样式的补丁匹配。本<dependencies>
节使用group:artifact[:version]
模式。它还提供了<includeModuleDependencies />
与<excludeModuleDependencies />
可以使用的包括或排除本地模块依赖关系的元素。
如果<include>
定义了no ,则考虑所有内容(未由较早的块声明)。
如果<exclude>
定义了no ,则不应用排除项。
查看<dependencies>
上面的示例,我们可以看到第一个<into>
将声明application.layer
. 下一个<into>
将声明该snapshot-dependencies
层的所有 SNAPSHOT 依赖项。final<into>
将声明该dependencies
层剩下的任何东西(在这种情况下,任何不是 SNAPSHOT 的依赖项)。
该<application>
块具有类似的规则。首先声明图层的org/springframework/boot/loader/**
内容spring-boot-loader
。然后为该application
层声明任何剩余的类和资源。
|
5.2. spring-boot:repackage
org.springframework.boot:spring-boot-maven-plugin:2.5.6
重新打包现有的 JAR 和 WAR 存档,以便可以使用java -jar
. Withlayout=NONE
也可以简单地用于打包具有嵌套依赖项的 JAR(没有主类,因此不可执行)。
5.2.1. 所需参数
姓名 | 类型 | 默认 |
|
|
5.2.2. 可选参数
姓名 | 类型 | 默认 |
|
| |
| ||
| ||
| ||
|
| |
| ||
| ||
|
| |
|
| |
| ||
| ||
| ||
| ||
| ||
|
| |
| ||
|
|
5.2.3. 参数详情
attach
附加要安装到本地 Maven 存储库或部署到远程存储库的重新打包存档。如果没有配置分类器,它将替换普通的 jar。如果 aclassifier
已配置为普通 jar 和重新包装的 jar 不同,则它将与普通 jar 一起附加。当该属性设置为 时false
,将不会安装或部署重新打包的存档。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 | |
自从 |
|
classifier
添加到重新打包存档的分类器。如果没有给出,主要工件将被重新打包的存档替换。如果给定,分类器也将用于确定要重新打包的源存档:如果具有该分类器的工件已经存在,它将用作源并替换。如果不存在此类工件,则主工件将用作源,重新打包的存档将作为该分类器的补充工件附加。附加工件允许将其与原始工件一起部署,参见 $1[$2]。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
embeddedLaunchScript
如果 jar 是完全可执行的,则嵌入的启动脚本要放在 jar 的前面。如果未指定,将使用“Spring Boot”默认脚本。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
embeddedLaunchScriptProperties
应在嵌入式启动脚本中展开的属性。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
excludeDevtools
从重新打包的存档中排除 Spring Boot devtools。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
excludeGroupIds
要排除的 groupId 名称的逗号分隔列表(完全匹配)。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
excludes
要排除的工件定义的集合。该Exclude
元素定义强制性groupId
和artifactId
性质和可选classifier
性。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
executable
通过在 jar 中添加启动脚本,为 *nix 机器制作一个完全可执行的 jar。<p> 目前,一些工具不接受这种格式,因此您可能并不总是能够使用这种技术。例如,jar -xf
可能会默默地无法提取已完全可执行的 jar 或 war。建议您仅在打算直接执行时才启用此选项,而不是使用java -jar
servlet 容器运行它或将其部署到 servlet 容器。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 | |
自从 |
|
includeSystemScope
包括系统范围的依赖项。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 | |
自从 |
|
includes
要包含的工件定义的集合。该Include
元素定义了强制groupId
和artifactId
属性以及可选的强制groupId
和artifactId
属性和一个可选classifier
属性。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
layers
图层配置,包括禁用图层创建、排除图层工具 jar 和提供自定义图层配置文件的选项。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
layout
存档的类型(对应于依赖项在其中的布局方式)。可能的值为JAR
、WAR
、ZIP
、DIR
、NONE
。默认为基于存档类型的猜测。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
layoutFactory
如果未设置显式布局,将用于创建可执行存档的布局工厂。3rd 方可以提供替代布局实现。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
mainClass
主类的名称。如果未指定,main
将使用找到的第一个包含方法的编译类。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
outputDirectory
包含生成的存档的目录。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 | |
自从 |
|
outputTimestamp
可重现输出存档条目的时间戳,格式为 ISO 8601 ( yyyy-MM-dd’T’HH:mm:ssXXX
) 或int
表示自纪元以来的秒数。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 | |
自从 |
|
requiresUnpack
必须从胖罐中解压才能运行的库列表。各指定库作为<dependency>
一个<groupId>
和<artifactId>
他们将在运行时解压。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
skip
跳过执行。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
5.3. 例子
5.3.1. 自定义分类器
默认情况下,repackage
目标用重新打包的工件替换原始工件。对于代表应用程序的模块来说,这是一种理智的行为,但如果您的模块用作另一个模块的依赖项,则需要为重新打包的模块提供分类器。这样做的原因是应用程序类被打包,BOOT-INF/classes
因此依赖模块无法加载重新打包的 jar 类。
如果是这种情况,或者如果您更喜欢保留原始工件并使用不同的分类器附加重新打包的工件,请按以下示例配置插件:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
如果您正在使用spring-boot-starter-parent
,则repackage
目标会在带有 id 的执行中自动执行repackage
。在该设置中,只应指定配置,如以下示例所示:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
此配置将生成两个工件:原始工件和由重新打包目标生成的重新打包对应部分。两者都将透明地安装/部署。
如果您想以替换主工件的相同方式重新打包辅助工件,您也可以使用相同的配置。以下配置task
使用重新打包的应用程序安装/部署单个分类工件:
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase>package</phase>
<configuration>
<classifier>task</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>task</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
由于 themaven-jar-plugin
和 thespring-boot-maven-plugin
在同一阶段运行,因此首先定义 jar 插件很重要(以便它在重新打包目标之前运行)。同样,如果您使用的是spring-boot-starter-parent
,则可以简化如下:
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>default-jar</id>
<configuration>
<classifier>task</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>task</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
5.3.2. 自定义名称
如果您需要重新打包的 jar 具有artifactId
与项目属性定义的本地名称不同的本地名称,请使用标准finalName
,如以下示例所示:
<project>
<build>
<finalName>my-app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
此配置将在target/my-app.jar
.
5.3.3. 本地重新包装的工件
默认情况下,repackage
目标将原始工件替换为可执行的工件。如果您只需要部署原始 jar 并且能够使用常规文件名运行您的应用程序,请按如下方式配置插件:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<attach>false</attach>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
此配置生成两个工件:原始工件和repackage
目标生成的可执行计数器部分。只会安装/部署原始的。
5.3.4. 自定义布局
Spring Boot 使用附加 jar 文件中定义的自定义布局工厂重新打包此项目的 jar 文件,作为构建插件的依赖项提供:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<layoutFactory implementation="com.example.CustomLayoutFactory">
<customProperty>value</customProperty>
</layoutFactory>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>custom-layout</artifactId>
<version>0.0.1.BUILD-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
布局工厂作为LayoutFactory
(from spring-boot-loader-tools
) 在 pom.xml 文件中明确指定的实现提供。如果LayoutFactory
插件类路径上只有一个自定义并且它被列出,META-INF/spring.factories
那么就没有必要在插件配置中显式设置它。
如果设置了显式布局,则始终忽略布局工厂。
5.3.5. 依赖排除
默认情况下,目标repackage
和run
目标都将包含provided
项目中定义的任何依赖项。Spring Boot 项目应将provided
依赖项视为运行应用程序所需的“容器”依赖项。
其中一些依赖项可能根本不需要,应该从可执行 jar 中排除。为了保持一致性,它们在运行应用程序时也不应该出现。
有两种方法可以在运行时从打包/使用中排除依赖项:
- 排除由
groupId
和标识的特定工件artifactId
,classifier
如果需要,可以选择使用。 - 排除属于给定
groupId
.
以下示例排除com.example:module1
,并且仅排除该工件:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>com.example</groupId>
<artifactId>module1</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
此示例排除属于该com.example
组的任何工件:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeGroupIds>com.example</excludeGroupIds>
</configuration>
</plugin>
</plugins>
</build>
</project>
5.3.6. 分层归档工具
创建分层 jar 或 war 时,该spring-boot-jarmode-layertools
jar 将作为依赖项添加到您的存档中。使用类路径上的这个 jar,您可以在特殊模式下启动您的应用程序,该模式允许引导代码运行与您的应用程序完全不同的东西,例如,提取图层的东西。如果您希望排除此依赖项,可以通过以下方式进行:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<includeLayerTools>false</includeLayerTools>
</layers>
</configuration>
</plugin>
</plugins>
</build>
</project>
5.3.7. 自定义图层配置
默认设置将依赖项拆分为快照和非快照,但是,您可能有更复杂的规则。例如,您可能希望在专用层中隔离项目的特定于公司的依赖项。以下layers.xml
配置显示了一种这样的设置:
<layers xmlns="http://www.springframework.org/schema/boot/layers"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/boot/layers
https://www.springframework.org/schema/boot/layers/layers-2.5.xsd">
<application>
<into layer="spring-boot-loader">
<include>org/springframework/boot/loader/**</include>
</into>
<into layer="application" />
</application>
<dependencies>
<into layer="snapshot-dependencies">
<include>*:*:*SNAPSHOT</include>
</into>
<into layer="company-dependencies">
<include>com.acme:*</include>
</into>
<into layer="dependencies"/>
</dependencies>
<layerOrder>
<layer>dependencies</layer>
<layer>spring-boot-loader</layer>
<layer>snapshot-dependencies</layer>
<layer>company-dependencies</layer>
<layer>application</layer>
</layerOrder>
</layers>
上面的配置创建了一个附加company-dependencies
层,其中包含所有具有com.acme
groupId 的库。
6. 包装 OCI 图像
该插件可以使用Cloud Native Buildpacks (CNB)从 jar 或 war 文件创建OCI 映像。可以使用目标构建图像。build-image
出于安全原因,图像以非 root 用户身份构建和运行。有关更多详细信息,请参阅CNB 规范。 |
最简单的入门方法是调用mvn spring-boot:build-image
一个项目。可以在package
调用阶段时自动创建图像,如下例所示:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-image</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
虽然 buildpack 从可执行存档运行,但没有必要先执行 |
6.1. Docker 守护进程
该build-image
目标需要访问 Docker 守护进程。默认情况下,它将通过本地连接与 Docker 守护进程通信。这适用于所有支持平台上的Docker 引擎,无需配置。
可以设置环境变量来配置build-image
目标以使用minikube 提供的Docker 守护进程。下表显示了环境变量及其值:
环境变量 | 描述 |
DOCKER_HOST | 包含 Docker 守护程序的主机和端口的 URL - 例如 |
DOCKER_TLS_VERIFY | 设置为 |
DOCKER_CERT_PATH | HTTPS 证书和密钥文件的路径(如果 是必需的 |
在 Linux 和 macOS 上,可以eval $(minikube docker-env)
在 minikube 启动后使用命令设置这些环境变量。
Docker 守护进程连接信息也可以使用docker
插件配置中的参数提供。下表总结了可用参数:
范围 | 描述 |
| 包含 Docker 守护程序的主机和端口的 URL - 例如 |
| 设置为 |
| Path to certificate and key files for HTTPS (required if |
For more details, see also examples.
6.2. Docker Registry
If the Docker images specified by the builder
or runImage
parameters are stored in a private Docker image registry that requires authentication, the authentication credentials can be provided using docker.builderRegistry
parameters.
If the generated Docker image is to be published to a Docker image registry, the authentication credentials can be provided using docker.publishRegistry
parameters.
Parameters are provided for user authentication or identity token authentication. Consult the documentation for the Docker registry being used to store images for further information on supported authentication methods.
The following table summarizes the available parameters for docker.builderRegistry
and docker.publishRegistry
:
Parameter | Description |
| Username for the Docker image registry user. Required for user authentication. |
| Password for the Docker image registry user. Required for user authentication. |
| Address of the Docker image registry. Optional for user authentication. |
| E-mail address for the Docker image registry user. Optional for user authentication. |
| Identity token for the Docker image registry user. Required for token authentication. |
For more details, see also examples.
6.3. Image Customizations
该插件调用构建器来协调图像的生成。助洗剂包括多个buildpacks可以检查该应用程序以影响所产生的图像。默认情况下,插件会选择构建器映像。生成的图像的名称是从项目属性中推导出来的。
该image
参数允许配置构建器以及它应该如何在项目上运行。下表总结了可用参数及其默认值:
参数/(用户属性) | 描述 | 默认值 |
| 要使用的构建器图像的名称。 |
|
| 要使用的运行映像的名称。 | 无默认值,表示应使用 Builder 元数据中指定的运行映像。 |
| 生成的图像的图像名称。 |
|
| 策略用于确定何时从注册表中拉建设者和运行图像。可接受的值是 |
|
| 应该传递给构建器的环境变量。 | |
| 构建器在构建映像时应使用的构建包。只会使用指定的构建包,覆盖构建器中包含的默认构建包。Buildpack 引用必须采用以下形式之一:
| 无,表示构建器应使用其中包含的构建包。 |
| 构建映像时应安装到构建器容器的卷绑定安装。创建构建器容器时,绑定将未经解析和未经验证传递给 Docker。绑定必须采用以下形式之一:
哪里
| |
| 是否在构建前清理缓存。 |
|
| 启用构建器操作的详细日志记录。 |
|
| 是否将生成的镜像发布到 Docker 注册中心。 |
|
该插件使用编译器的插件配置或 |
有关更多详细信息,另请参见示例。
6.4. spring-boot:build-image
org.springframework.boot:spring-boot-maven-plugin:2.5.6
使用 buildpack 将应用程序打包到 OCI 映像中。
6.4.1. 所需参数
姓名 | 类型 | 默认 |
|
|
6.4.2. 可选参数
姓名 | 类型 | 默认 |
| ||
| ||
|
| |
| ||
| ||
| ||
|
| |
| ||
| ||
| ||
| ||
| ||
|
|
6.4.3. 参数详情
classifier
查找源存档时使用的分类器。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
docker
Docker 配置选项。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
excludeDevtools
从重新打包的存档中排除 Spring Boot devtools。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
excludeGroupIds
要排除的 groupId 名称的逗号分隔列表(完全匹配)。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
excludes
要排除的工件定义的集合。该Exclude
元素定义强制性groupId
和artifactId
性质和可选classifier
性。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
image
图像的配置,与builder
,runImage
,name
,env
,cleanCache
,verboseLogging
,pullPolicy
,和publish
选项。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
includeSystemScope
包括系统范围的依赖项。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 | |
自从 |
|
includes
要包含的工件定义的集合。该Include
元素定义了强制groupId
和artifactId
属性以及可选的强制groupId
和artifactId
属性和一个可选classifier
属性。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
layers
图层配置,包括禁用图层创建、排除图层工具 jar 和提供自定义图层配置文件的选项。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
layout
存档的类型(对应于依赖项在其中的布局方式)。可能的值为JAR
、WAR
、ZIP
、DIR
、NONE
。默认为基于存档类型的猜测。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
layoutFactory
如果未设置显式布局,将用于创建可执行存档的布局工厂。3rd 方可以提供替代布局实现。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
mainClass
主类的名称。如果未指定,main
将使用找到的第一个包含方法的编译类。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
skip
跳过执行。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
sourceDirectory
包含源存档的目录。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 | |
自从 |
|
6.5. 例子
6.5.1. 自定义图像生成器
如果您需要自定义用于创建镜像的构建器或用于启动构建镜像的运行镜像,请按以下示例配置插件:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>mine/java-cnb-builder</builder>
<runImage>mine/java-cnb-run</runImage>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
该配置将使用一个建设者形象的名称mine/java-cnb-builder
和标记latest
,并命名为连串图像mine/java-cnb-run
和标签latest
。
构建器和运行映像也可以在命令行上指定,如下例所示:
$ mvn spring-boot:build-image -Dspring-boot.build-image.builder=mine/java-cnb-builder -Dspring-boot.build-image.runImage=mine/java-cnb-run
6.5.2. 构建器配置
如果构建器使用环境变量公开配置选项,则可以使用env
属性设置这些选项。
以下是在构建时配置Paketo Java buildpacks 使用的 JVM 版本的示例:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<env>
<BP_JVM_VERSION>8.*</BP_JVM_VERSION>
</env>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
如果构建器运行所在的 Docker 守护进程与构建包从中下载工件的网络位置之间存在网络代理,则您需要配置构建器以使用该代理。使用 Paketo 构建器时,这可以通过设置HTTPS_PROXY
和/或HTTP_PROXY
环境变量来完成,如下例所示:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<env>
<HTTP_PROXY>http://proxy.example.com</HTTP_PROXY>
<HTTPS_PROXY>https://proxy.example.com</HTTPS_PROXY>
</env>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
6.5.3. 运行时 JVM 配置
Paketo Java 构建包通过设置环境变量来配置 JVM 运行时环境JAVA_TOOL_OPTIONS
。JAVA_TOOL_OPTIONS
当应用程序映像在容器中启动时,可以修改buildpack 提供的值以自定义 JVM 运行时行为。
应该存储在映像中并应用于每个部署的环境变量修改可以按照Paketo 文档中的描述进行设置,并在以下示例中显示:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<env>
<BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
<BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:+HeapDumpOnOutOfMemoryError</BPE_APPEND_JAVA_TOOL_OPTIONS>
</env>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
6.5.4. 自定义图像名称
默认情况下,图像名称是从项目的artifactId
和推断出来的version
,类似于docker.io/library/${project.artifactId}:${project.version}
. 您可以控制名称,如以下示例所示:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<name>example.com/library/${project.artifactId}</name>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
也可以在命令行上指定图像名称,如下例所示:
$ mvn spring-boot:build-image -Dspring-boot.build-image.imageName=example.com/library/my-app:v1
6.5.5. 构建包
默认情况下,构建器将使用构建器映像中包含的构建包,并以预定义的顺序应用它们。可以提供一组替代的构建包来应用构建器中未包含的构建包,或更改包含的构建包的顺序。当提供一个或多个 buildpack 时,只会应用指定的 buildpack。
以下示例指示构建器使用打包在.tgz
文件中的自定义构建包,然后是构建器中包含的构建包。
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<buildpacks>
<buildpack>file:///path/to/example-buildpack.tgz</buildpack>
<buildpack>urn:cnb:builder:paketo-buildpacks/java</buildpack>
</buildpacks>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
Buildpacks 可以以下面显示的任何形式指定。
位于 CNB Builder 中的构建包(如果构建器中只有一个与 匹配的构建包,则可以省略版本buildpack-id
):
urn:cnb:builder:buildpack-id
urn:cnb:builder:buildpack-id@0.0.1
buildpack-id
buildpack-id@0.0.1
包含 buildpack 内容的目录的路径(Windows 不支持):
file:///path/to/buildpack/
/path/to/buildpack/
包含 buildpack 内容的 gzip tar 文件的路径:
file:///path/to/buildpack.tgz
/path/to/buildpack.tgz
包含打包 buildpack的 OCI 映像:
docker://example/buildpack
docker:///example/buildpack:latest
docker:///example/buildpack@sha256:45b23dee08…
example/buildpack
example/buildpack:latest
example/buildpack@sha256:45b23dee08…
6.5.6. 图片出版
通过启用publish
选项并使用docker.publishRegistry
参数配置注册表的身份验证,可以将生成的映像发布到 Docker 注册表。
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">image</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">name</span>></span>docker.example.com/library/${project.artifactId}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">name</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">publish</span>></span>true<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">publish</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">image</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">docker</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">publishRegistry</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">username</span>></span>user<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">username</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">password</span>></span>secret<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">password</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">url</span>></span>https://docker.example.com/v1/<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">url</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">email</span>></span>user@example.com<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">email</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">publishRegistry</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">docker</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
The publish
option can be specified on the command line as well, as shown in this example:
$ mvn spring-boot:build-image -Dspring-boot.build-image.imageName=docker.example.com/library/my-app:v1 -Dspring-boot.build-image.publish=true
6.5.7. Docker Configuration
If you need the plugin to communicate with the Docker daemon using a remote connection instead of the default local connection, the connection details can be provided using docker
parameters as shown in the following example:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">docker</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">host</span>></span>tcp://192.168.99.100:2376<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">host</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">tlsVerify</span>></span>true<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">tlsVerify</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">certPath</span>></span>/home/user/.minikube/certs<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">certPath</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">docker</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
如果构建器或运行映像存储在支持用户身份验证的私有 Docker 注册表中,则可以使用docker.builderRegistry
参数提供身份验证详细信息,如下例所示:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">docker</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">builderRegistry</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">username</span>></span>user<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">username</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">password</span>></span>secret<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">password</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">url</span>></span>https://docker.example.com/v1/<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">url</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">email</span>></span>user@example.com<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">email</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">builderRegistry</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">docker</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
如果构建器或运行映像存储在支持令牌身份验证的私有 Docker 注册表中,则可以使用docker.builderRegistry
参数提供令牌值,如下例所示:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">docker</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">builderRegistry</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">token</span>></span>9cbaf023786cd7...<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">token</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">builderRegistry</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">docker</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
7. 使用 Maven 运行您的应用程序
该插件包含一个运行目标,可用于从命令行启动您的应用程序,如以下示例所示:
$ mvn spring-boot:run
可以使用arguments
参数指定应用程序参数,有关更多详细信息,请参阅使用应用程序参数。
默认情况下,应用程序在分叉进程中执行,在命令行上设置属性不会影响应用程序。如果您需要指定一些 JVM 参数(即用于调试目的),您可以使用该jvmArguments
参数,有关更多详细信息,请参阅调试应用程序。还明确支持系统属性和环境变量。
由于启用配置文件非常普遍,因此有专门的profiles
属性为 提供快捷方式-Dspring-boot.run.jvmArguments="-Dspring.profiles.active=dev"
,请参阅指定活动配置文件。
虽然不推荐这样做,但可以通过禁用该fork
属性直接从 Maven JVM 执行应用程序。这样做意味着的jvmArguments
,systemPropertyVariables
,environmentVariables
和agents
选项都将被忽略。
Spring Bootdevtools
是一个用于改善 Spring Boot 应用程序开发时体验的模块。要启用它,只需将以下依赖项添加到您的项目中:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">dependencies</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">dependency</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-devtools<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">optional</span>></span>true<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">optional</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">dependency</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">dependencies</span>></span></code></span></span>
当devtools
运行时,它检测到的变化,当你重新编译应用程序,并自动刷新它。这不仅适用于资源,也适用于代码。它还提供了一个 LiveReload 服务器,以便在情况发生变化时自动触发浏览器刷新。
Devtools 还可以配置为仅在静态资源发生更改时才刷新浏览器(并忽略代码中的任何更改)。只需在您的项目中包含以下属性:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-properties"><span style="color:var(--highlight-meta-font-color)">spring.devtools.remote.restart.enabled</span>=<span style="color:var(--highlight-string-font-color)">false</span></code></span></span>
在 之前devtools
,插件默认支持热刷新资源,现在已禁用以支持上述解决方案。您可以随时通过配置项目来恢复它:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">addResources</span>></span>true<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">addResources</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span></code></span></span>
当addResources
启用时,任何src/main/resources
当你运行应用程序,并在任何重复found目录将被添加到应用程序类路径target/classes
将被删除。这允许热刷新资源,这在开发 Web 应用程序时非常有用。例如,您可以处理 HTML、CSS 或 JavaScript 文件并立即查看您的更改,而无需重新编译您的应用程序。这也是一种允许前端开发人员无需下载和安装 Java IDE 即可工作的有用方式。
使用此功能的一个副作用是在构建时过滤资源将不起作用。 |
为了与repackage
目标保持一致,目标run
以这样一种方式构建类路径,即插件配置中排除的任何依赖项也从类路径中排除。有关更多详细信息,请参阅专用示例。
有时在运行应用程序时包含测试依赖项很有用。例如,如果您想在使用存根类的测试模式下运行您的应用程序。如果您希望这样做,您可以将useTestClasspath
参数设置为 true。
这仅在您运行应用程序时应用: |
7.1. spring-boot:run
org.springframework.boot:spring-boot-maven-plugin:2.5.6
就地运行应用程序。
7.1.1. 所需参数
姓名 | 类型 | 默认 |
|
|
7.1.2. 可选参数
姓名 | 类型 | 默认 |
|
| |
| ||
| ||
| ||
| ||
| ||
| ||
| ||
|
| |
| ||
| ||
| ||
| ||
|
| |
| ||
|
| |
| ||
|
| |
|
7.1.3. 参数详情
addResources
直接将 Maven 资源添加到类路径,这允许对资源进行实时就地编辑。target/classes
如果ClassLoader.getResources()
被调用,重复的资源将被删除以防止它们出现两次。请考虑添加spring-boot-devtools
到您的项目中,因为它提供了此功能以及更多功能。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
agents
代理罐子的路径。注意:使用此功能需要一个分叉的进程。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
arguments
应传递给应用程序的参数。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
classesDirectory
包含应打包到存档中的类和资源文件的目录。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 | |
自从 |
|
commandlineArguments
命令行中应该传递给应用程序的参数。使用空格分隔多个参数,并确保在引号之间包含多个值。指定时,优先于#arguments
。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
directories
除了应添加到类路径的类目录之外的其他目录。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
environmentVariables
应与用于运行应用程序的分叉进程关联的环境变量列表。注意:使用此功能需要一个分叉的进程。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
excludeGroupIds
要排除的 groupId 名称的逗号分隔列表(完全匹配)。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
excludes
要排除的工件定义的集合。该Exclude
元素定义强制性groupId
和artifactId
性质和可选classifier
性。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
fork
用于指示是否应分叉运行进程的标志。禁用分叉将禁用某些功能,例如代理、自定义 JVM 参数、开发工具或指定要使用的工作目录。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
includes
要包含的工件定义的集合。该Include
元素定义了强制groupId
和artifactId
属性以及可选的强制groupId
和artifactId
属性和一个可选classifier
属性。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
jvmArguments
应该与用于运行应用程序的分叉进程相关联的 JVM 参数。在命令行上,确保在引号之间包含多个值。注意:使用此功能需要一个分叉的进程。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
mainClass
主类的名称。如果未指定,将使用找到的第一个包含“main”方法的编译类。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
noverify
标记表示代理需要 -noverify。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
optimizedLaunch
JVM 的启动是否应该优化。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
profiles
要激活的弹簧轮廓。指定 'spring.profiles.active' 参数的便捷快捷方式。在命令行上使用逗号分隔多个配置文件。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
skip
跳过执行。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
systemPropertyVariables
要传递给进程的 JVM 系统属性列表。注意:使用此功能需要一个分叉的进程。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
useTestClasspath
标记以在运行时包含测试类路径。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
workingDirectory
用于应用程序的当前工作目录。如果未指定,则将使用 basedir。注意:使用此功能需要一个分叉的进程。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
7.2. 例子
7.2.1. 调试应用程序
默认情况下,run
目标在分叉进程中运行您的应用程序。如果您需要调试它,您应该添加必要的 JVM 参数以启用远程调试。以下配置暂停进程,直到调试器加入端口 5005:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">jvmArguments</span>></span>
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">jvmArguments</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
这些参数也可以在命令行上指定,确保正确包装,即:
$ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"
7.2.2. 使用系统属性
可以使用该systemPropertyVariables
属性指定系统属性。以下示例设置property1
为test
和property2
42:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">properties</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">my.value</span>></span>42<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">my.value</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">properties</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">systemPropertyVariables</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">property1</span>></span>test<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">property1</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">property2</span>></span>${my.value}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">property2</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">systemPropertyVariables</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
If the value is empty or not defined (i.e. <my-property/
>), the system property is set with an empty String as the value. Maven trims values specified in the pom so it is not possible to specify a System property which needs to start or end with a space via this mechanism: consider using jvmArguments
instead.
Any String typed Maven variable can be passed as system properties. Any attempt to pass any other Maven variable type (e.g. a List
or a URL
variable) will cause the variable expression to be passed literally (unevaluated).
The jvmArguments
parameter takes precedence over system properties defined with the mechanism above. In the following example, the value for property1
is overridden
:
$ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dproperty1=overridden"
7.2.3. Using Environment Variables
Environment variables can be specified using the environmentVariables
attribute. The following example sets the 'ENV1', 'ENV2', 'ENV3', 'ENV4' env variables:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">environmentVariables</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">ENV1</span>></span>5000<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">ENV1</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">ENV2</span>></span>Some Text<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">ENV2</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">ENV3</span>/></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">ENV4</span>></span><span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">ENV4</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">environmentVariables</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
If the value is empty or not defined (i.e. <MY_ENV/
>), the env variable is set with an empty String as the value. Maven trims values specified in the pom so it is not possible to specify an env variable which needs to start or end with a space.
Any String typed Maven variable can be passed as system properties. Any attempt to pass any other Maven variable type (e.g. a List
or a URL
variable) will cause the variable expression to be passed literally (unevaluated).
Environment variables defined this way take precedence over existing values.
7.2.4. Using Application Arguments
可以使用该arguments
属性指定应用程序参数。以下示例设置两个参数:property1
和property2=42
:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">arguments</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">argument</span>></span>property1<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">argument</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">argument</span>></span>property2=${my.value}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">argument</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">arguments</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
在命令行上,参数以相同的方式用空格分隔jvmArguments
。如果参数包含空格,请确保将其引用。在以下示例中,有两个参数可用:property1
和property2=Hello World
:
$ mvn spring-boot:run -Dspring-boot.run.arguments="property1 'property2=Hello World'"
7.2.5. 指定活动配置文件
可以使用profiles
参数指定用于特定应用程序的活动配置文件。
以下配置启用local
和dev
配置文件:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">profiles</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">profile</span>></span>local<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">profile</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">profile</span>></span>dev<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">profile</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">profiles</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
要启用的配置文件也可以在命令行上指定,确保用逗号分隔它们,如以下示例所示:
$ mvn spring-boot:run -Dspring-boot.run.profiles=local,dev
8. 运行集成测试
虽然您可以很容易地从您的测试(或测试套件)本身启动您的 Spring Boot 应用程序,但在构建本身中处理它可能是可取的。为了确保围绕集成测试正确管理 Spring Boot 应用程序的生命周期,您可以使用start
和stop
目标,如以下示例所示:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">id</span>></span>pre-integration-test<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">id</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goal</span>></span>start<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goal</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">id</span>></span>post-integration-test<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">id</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goal</span>></span>stop<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goal</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span></code></span></span>
这样的设置现在可以使用故障安全插件来运行您所期望的集成测试。
默认情况下,应用程序在单独的进程中启动,并使用 JMX 与应用程序通信。如果您需要配置 JMX 端口,请参阅专用示例。 |
您还可以配置更高级的设置以在设置特定属性后跳过集成测试,请参阅专用示例。
8.1. 在没有 Spring Boot 的父 POM 的情况下使用故障安全
Spring Boot 的父 POMspring-boot-starter-parent
将故障安全配置<classesDirectory>
为${project.build.outputDirectory}
. 如果没有这个配置,它会导致 Failsafe 使用编译的类而不是重新打包的 jar,Failsafe 无法加载应用程序的类。如果您不使用父 POM,则应以相同的方式配置 Failsafe,如以下示例所示:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.apache.maven.plugins<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>maven-failsafe-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">classesDirectory</span>></span>${project.build.outputDirectory}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">classesDirectory</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span></code></span></span>
8.2. spring-boot:start
org.springframework.boot:spring-boot-maven-plugin:2.5.6
启动一个 spring 应用程序。与run
目标相反,这不会阻止并允许其他目标对应用程序进行操作。此目标通常用于集成测试场景,其中应用程序在测试套件之前启动并在测试套件之后停止。
8.2.1. 所需参数
姓名 | 类型 | 默认 |
|
|
8.2.2. 可选参数
姓名 | 类型 | 默认 |
|
| |
| ||
| ||
| ||
| ||
| ||
| ||
| ||
|
| |
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
|
| |
| ||
|
| |
| ||
|
8.2.3. 参数详情
addResources
直接将 Maven 资源添加到类路径,这允许对资源进行实时就地编辑。target/classes
如果ClassLoader.getResources()
被调用,重复的资源将被删除以防止它们出现两次。请考虑添加spring-boot-devtools
到您的项目中,因为它提供了此功能以及更多功能。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
agents
代理罐子的路径。注意:使用此功能需要一个分叉的进程。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
arguments
应传递给应用程序的参数。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
classesDirectory
包含应打包到存档中的类和资源文件的目录。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 | |
自从 |
|
commandlineArguments
命令行中应该传递给应用程序的参数。使用空格分隔多个参数,并确保在引号之间包含多个值。指定时,优先于#arguments
。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
directories
除了应添加到类路径的类目录之外的其他目录。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
environmentVariables
应与用于运行应用程序的分叉进程关联的环境变量列表。注意:使用此功能需要一个分叉的进程。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
excludeGroupIds
要排除的 groupId 名称的逗号分隔列表(完全匹配)。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
excludes
要排除的工件定义的集合。该Exclude
元素定义强制性groupId
和artifactId
性质和可选classifier
性。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
fork
用于指示是否应分叉运行进程的标志。禁用分叉将禁用某些功能,例如代理、自定义 JVM 参数、开发工具或指定要使用的工作目录。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
includes
要包含的工件定义的集合。该Include
元素定义了强制groupId
和artifactId
属性以及可选的强制groupId
和artifactId
属性和一个可选classifier
属性。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
jmxName
管理 spring 应用程序生命周期的自动部署的 MBean 的 JMX 名称。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
jmxPort
如果应用程序是分叉的,则用于公开平台 MBeanServer 的端口。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
jvmArguments
应该与用于运行应用程序的分叉进程相关联的 JVM 参数。在命令行上,确保在引号之间包含多个值。注意:使用此功能需要一个分叉的进程。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
mainClass
主类的名称。如果未指定,将使用找到的第一个包含“main”方法的编译类。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
maxAttempts
检查 spring 应用程序是否准备就绪的最大尝试次数。结合“wait”参数,这给出了一个全局超时值(默认为 30 秒)
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
noverify
标记表示代理需要 -noverify。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
profiles
要激活的弹簧轮廓。指定 'spring.profiles.active' 参数的便捷快捷方式。在命令行上使用逗号分隔多个配置文件。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
skip
跳过执行。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
systemPropertyVariables
要传递给进程的 JVM 系统属性列表。注意:使用此功能需要一个分叉的进程。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
useTestClasspath
标记以在运行时包含测试类路径。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
wait
每次尝试检查 spring 应用程序是否准备好之间等待的毫秒数。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
workingDirectory
用于应用程序的当前工作目录。如果未指定,则将使用 basedir。注意:使用此功能需要一个分叉的进程。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
8.3. spring-boot:stop
org.springframework.boot:spring-boot-maven-plugin:2.5.6
停止由“开始”目标启动的应用程序。通常在测试套件完成后调用。
8.3.1. 可选参数
姓名 | 类型 | 默认 |
| ||
| ||
| ||
|
|
8.3.2. 参数详情
fork
用于指示要停止的进程是否已分叉的标志。默认情况下,该值是从 继承的,并MavenProject
具有默认分叉值 ( true
)的回退。如果已设置,则它必须与StartMojo start
进程使用的值相匹配。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
|
jmxName
管理应用程序生命周期的自动部署的 MBean 的 JMX 名称。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
jmxPort
如果应用程序已分叉,则用于查找平台 MBeanServer 的端口。
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
skip
跳过执行。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
|
8.4. 例子
8.4.1. 用于集成测试的随机端口
Spring Boot 测试集成的一个很好的特性是它可以为 Web 应用程序分配一个空闲端口。start
使用插件的目标时,单独启动Spring Boot应用程序,很难将实际端口传递给集成测试本身。
下面的示例展示了如何使用Build Helper Maven Plugin实现相同的功能:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.codehaus.mojo<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>build-helper-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">id</span>></span>reserve-tomcat-port<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">id</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goal</span>></span>reserve-network-port<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goal</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">phase</span>></span>process-resources<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">phase</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">portNames</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">portName</span>></span>tomcat.http.port<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">portName</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">portNames</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">id</span>></span>pre-integration-test<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">id</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goal</span>></span>start<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goal</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">arguments</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">argument</span>></span>--server.port=${tomcat.http.port}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">argument</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">arguments</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">id</span>></span>post-integration-test<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">id</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goal</span>></span>stop<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goal</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.apache.maven.plugins<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>maven-failsafe-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">systemPropertyVariables</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">test.server.port</span>></span>${tomcat.http.port}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">test.server.port</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">systemPropertyVariables</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span></code></span></span>
您现在可以test.server.port
在任何集成测试中检索系统属性以创建URL
服务器的专有属性。
8.4.2. 自定义 JMX 端口
该jmxPort
属性允许自定义插件用于与 Spring Boot 应用程序通信的端口。
此示例显示了如何在9001
已使用端口的情况下自定义端口:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">jmxPort</span>></span>9009<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">jmxPort</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">id</span>></span>pre-integration-test<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">id</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goal</span>></span>start<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goal</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">id</span>></span>post-integration-test<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">id</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goal</span>></span>stop<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goal</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span></code></span></span>
如果您需要配置 JMX 端口,请确保在如上所示的全局配置中进行配置,以便两个目标共享。 |
8.4.3. 跳过集成测试
该skip
属性允许完全跳过 Spring Boot maven 插件的执行。
此示例展示了如何使用命令行属性跳过集成测试并仍然确保repackage
目标运行:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">properties</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">skip.it</span>></span>false<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">skip.it</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">properties</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">id</span>></span>pre-integration-test<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">id</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goal</span>></span>start<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goal</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">skip</span>></span>${skip.it}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">skip</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">id</span>></span>post-integration-test<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">id</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goal</span>></span>stop<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goal</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">skip</span>></span>${skip.it}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">skip</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.apache.maven.plugins<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>maven-failsafe-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">skip</span>></span>${skip.it}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">skip</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
默认情况下,集成测试将运行,但此设置允许您在命令行上轻松禁用它们,如下所示:
$ mvn verify -Dskip.it=true
9. 与执行器集成
如果META-INF/build-info.properties
文件存在,Spring Boot Actuator 会显示与构建相关的信息。该build-info
目标生成与该项目的坐标和建造时间这样的文件。它还允许您添加任意数量的附加属性,如以下示例所示:
<span style="color:#191e1e"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">project</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">modelVersion</span>></span>4.0.0<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">modelVersion</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>build-info<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>org.springframework.boot<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">groupId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>spring-boot-maven-plugin<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">artifactId</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">goal</span>></span>build-info<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goal</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">goals</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">additionalProperties</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">encoding.source</span>></span>UTF-8<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">encoding.source</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">encoding.reporting</span>></span>UTF-8<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">encoding.reporting</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">java.source</span>></span>${maven.compiler.source}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">java.source</span>></span>
<span style="color:var(--highlight-tag-font-color)"><<span style="color:var(--highlight-tag-font-color)">java.target</span>></span>${maven.compiler.target}<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">java.target</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">additionalProperties</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">configuration</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">execution</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">executions</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugin</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">plugins</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">build</span>></span>
<span style="color:var(--highlight-tag-font-color)"></<span style="color:var(--highlight-tag-font-color)">project</span>></span></code></span></span>
此配置将build-info.properties
在预期位置生成带有四个附加密钥的 。
|
9.1. spring-boot:build-info
org.springframework.boot:spring-boot-maven-plugin:2.5.6
build-info.properties
根据当前的内容生成文件MavenProject
。
9.1.1. 可选参数
姓名 | 类型 | 默认 |
| ||
|
| |
|
9.1.2. 参数详情
additionalProperties
要存储在build-info.properties
文件中的其他属性。每个条目build.
在生成的build-info.properties
.
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
outputFile
生成build-info.properties
文件的位置。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 | |
自从 |
time
build.time
以适合于 的形式用于属性的值Instant#parse(CharSequence)
。默认为session.request.startTime
. 要build.time
完全禁用该属性,请使用'off'
.
姓名 |
|
类型 |
|
默认值 | |
用户属性 | |
自从 |
|
10. 帮助信息
该help
目标是一个标准的目的是显示对插件的功能信息。
10.1. spring-boot:help
org.springframework.boot:spring-boot-maven-plugin:2.5.6
显示有关 spring-boot-maven-plugin 的帮助信息。调用mvn spring-boot:help -Ddetail=true -Dgoal=<goal-name>
以显示参数详细信息。
10.1.1. 可选参数
姓名 | 类型 | 默认 |
|
| |
| ||
|
| |
|
|
10.1.2. 参数详情
detail
如果true
,则显示每个目标的所有可设置属性。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
goal
显示帮助的目标的名称。如果未指定,将显示所有目标。
姓名 |
|
类型 |
|
默认值 | |
用户属性 |
|
自从 |
indentSize
每个缩进级别的空格数应为正数。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |
lineLength
显示行的最大长度,应为正。
姓名 |
|
类型 |
|
默认值 |
|
用户属性 |
|
自从 |