此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.4.0! |
打包可执行存档文件
该插件可以创建包含应用程序所有依赖项的可执行存档(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>
这repackage goal 不能在命令行上单独使用,因为它在源上运行jar (或war ) 由package 阶段。
要在命令行上使用此目标,您必须包含package 阶段:mvn package spring-boot:repackage . |
如果您正在使用spring-boot-starter-parent ,则此类执行已经预先配置了repackage 执行 ID,以便只添加插件定义。 |
上面的示例将jar
或war
在 Maven 生命周期的包阶段构建的 archive 中,包括任何provided
在项目中定义的依赖项。
如果需要排除其中一些依赖项,您可以使用exclude
选项;有关更多详细信息,请参阅依赖项排除。
原始 (不可执行) 构件文件将重命名为.original
默认情况下,但也可以使用自定义分类器保留原始构件。
这outputFileNameMapping 的特性maven-war-plugin 当前不受支持。 |
这spring-boot-devtools
和spring-boot-docker-compose
默认情况下,模块会自动排除(您可以使用excludeDevtools
和excludeDockerCompose
属性)。
为了使它与war
packaging 中,使用spring-boot-devtools
和spring-boot-docker-compose
dependencies 必须设置为optional
或使用provided
范围。
该插件会重写您的清单,特别是管理Main-Class
和Start-Class
条目。
如果默认值不起作用,则必须在 Spring Boot 插件中配置值,而不是在 jar 插件中配置值。
这Main-Class
在 manifest 中由layout
Spring Boot 插件的属性,如以下示例所示:
<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
dependencies 被放置在WEB-INF/lib-provided
为避免在war
部署在 servlet 容器中。 -
ZIP
(别名设置为DIR
):类似于JAR
布局使用PropertiesLauncher
. -
NONE
:捆绑所有依赖项和项目资源。不捆绑 bootstrap 加载程序。
分层 Jar 或 War
重新打包的 jar 包含应用程序的类和依赖项BOOT-INF/classes
和BOOT-INF/lib
分别。
同样,可执行的 war 包含应用程序的类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>
自定义图层配置
根据您的应用程序,您可能希望调整层的创建方式并添加新层。 这可以使用一个单独的配置文件来完成,该文件应该被注册,如下所示:
<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>
配置文件描述了如何将档案分离为多个层,以及这些层的顺序。 以下示例显示了如何显式定义上述默认 Sequences:
<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-3.3.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>
,则考虑所有内容(未被先前的块声明)。
如果没有<exclude>
,则不会应用任何排除项。
查看<dependencies>
示例,我们可以看到第一个<into>
将声明application.layer
.
下一个<into>
将声明snapshot-dependencies
层。
决赛<into>
将声明dependencies
层。
这<application>
block 也有类似的规则。
首次认领org/springframework/boot/loader/**
content 的spring-boot-loader
层。
然后为application
层。
订单<into> blocks are defined 通常与层的写入顺序不同。
因此,<layerOrder> 元素必须始终包含在内,并且必须覆盖<into> 块。 |
spring-boot:repackage
org.springframework.boot:spring-boot-maven-plugin:3.3.7-SNAPSHOT
重新打包现有的 JAR 和 WAR 存档,以便可以使用java -jar
.跟layout=NONE
也可以简单地用于打包具有嵌套依赖项的 JAR(并且没有主类,因此不是可执行文件)。
可选参数
名字 | 类型 | 违约 |
---|---|---|
|
|
|
|
||
|
||
|
||
|
|
|
|
|
|
|
||
|
||
|
|
|
|
|
|
|
|
|
|
||
|
||
|
|
|
|
||
|
|
参数详情
attach
将重新打包的存档附加到本地 Maven 存储库或部署到远程存储库。如果未配置分类器,它将替换普通的 jar。如果classifier
已配置,使得普通 jar 和重新打包的 jar 不同,它将与普通 jar 一起附加。当属性设置为false
,则不会安装或部署重新打包的存档。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
classifier
Classifier 添加到重新打包的存档中。如果未给出,则 main artifact 将被 repackaged archive 替换。如果给定,则分类器也将用于确定要重新打包的源存档:如果已经存在具有该分类器的工件,则它将被用作源并替换。如果不存在此类工件,则主工件将用作源,并且重新打包的档案将作为该分类器的补充工件附加。附加工件允许将其与原始工件一起部署,有关更多详细信息,请参阅 Maven 文档。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
embeddedLaunchScript
嵌入式启动脚本,如果 jar 是完全可执行的,则将其预置到 jar 的前面。如果未指定,则将使用 'Spring Boot' 默认脚本。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
embeddedLaunchScriptProperties
应在嵌入式启动脚本中展开的属性。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
excludeDevtools
从重新打包的存档中排除 Spring Boot devtools。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
excludeDockerCompose
从重新打包的存档中排除 Spring Boot 开发服务。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
excludeGroupIds
要排除的 groupId 名称的逗号分隔列表(完全匹配)。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
excludes
要排除的项目定义的集合。这Exclude
元素定义 mandatorygroupId
和artifactId
组件和可选的classifier
元件。当配置为属性时,值应使用冒号分隔的组件进行逗号分隔:groupId:artifactId,groupId:artifactId:classifier
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
executable
通过在 jar 中预置启动脚本,为 *nix 计算机创建一个完全可执行的 jar。<p> 目前,某些工具不接受这种格式,因此您可能无法始终使用这种技术。例如jar -xf
可能会静默地无法提取已完全可执行的 jar 或 war。建议您仅在打算直接执行此选项时启用此选项,而不是使用java -jar
或将其部署到 servlet 容器。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
includes
要包含的项目定义的集合。这Include
元素定义 mandatorygroupId
和artifactId
组件和可选的classifier
元件。当配置为属性时,值应使用冒号分隔的组件进行逗号分隔:groupId:artifactId,groupId:artifactId:classifier
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
layout
存档的类型(对应于其中依赖项的布局方式)。可能的值为JAR
,WAR
,ZIP
,DIR
,NONE
.默认为基于存档类型的猜测。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
outputDirectory
包含生成的存档的目录。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
outputTimestamp
可重现输出存档条目的时间戳,格式为 ISO 8601 (yyyy-MM-dd’T’HH:mm:ssXXX
) 或int
表示自 epoch 以来的秒数。
名字 |
|
---|---|
类型 |
|
默认值 |
|
用户属性 |
|
因为 |
|
例子
自定义分类器
默认情况下,repackage
goal 将原始工件替换为重新打包的工件。
对于代表应用程序的模块来说,这是一种合理的行为,但如果您的模块用作另一个模块的依赖项,则需要为重新打包的模块提供分类器。
这样做的原因是应用程序类被打包在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
goal 在 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>
此配置将生成两个工件:原始工件和由 repackage 目标生成的 repackaged 对应部分。 两者都将以透明方式安装/部署。
如果要以与替换主构件相同的方式重新打包辅助构件,也可以使用相同的配置。
以下配置安装/部署单个task
classified 工件替换为重新打包的应用程序:
<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>
由于maven-jar-plugin
和spring-boot-maven-plugin
在同一阶段运行,重要的是首先定义 jar 插件(以便它在 repackage 目标之前运行)。
同样,如果你正在使用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>
自定义名称
如果你需要重新打包的 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
.
本地重新打包的工件
默认情况下,repackage
goal 将原始工件替换为可执行工件。
如果您只需要部署原始 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
目标。
将仅安装/部署原始 ID。
自定义布局
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
(来自spring-boot-loader-tools
) 在 POM 中显式指定。
如果只有一个自定义LayoutFactory
在插件 classpath 上,它列在META-INF/spring.factories
那么就没有必要在 plugin 配置中显式设置它。
如果设置了显式布局,则始终忽略布局工厂。
依赖项排除
默认情况下,repackage
和run
目标将包括任何provided
在项目中定义的依赖项。
Spring Boot 项目应考虑provided
dependencies 指定为运行应用程序所需的 “container” 依赖项。
一般来说, Spring Boot 项目不用作依赖项,因此不太可能有任何依赖项optional
依赖。
当项目确实具有可选依赖项时,它们也将包含在repackage
和run
目标。
其中一些依赖项可能根本不是必需的,应该从可执行 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>
JAR 工具
创建分层 jar 或 war 时,spring-boot-jarmode-tools
jar 将作为依赖项添加到您的存档中。
在 Classpath 上使用此 jar,您可以以特殊模式启动应用程序,该模式允许引导代码运行与应用程序完全不同的东西,例如,提取层的东西。
如果您希望排除此依赖项,可以通过以下方式进行:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeTools>false</includeTools>
</configuration>
</plugin>
</plugins>
</build>
</project>
自定义图层配置
默认设置将依赖项拆分为快照和非快照,但是,您可能有更复杂的规则。
例如,您可能希望将项目的公司特定依赖项隔离在专用层中。
以下内容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-3.3.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 的 ID 中。