此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.4.4

打包可执行存档文件

该插件可以创建包含应用程序所有依赖项的可执行存档(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>
repackagegoal 不能在命令行上单独使用,因为它在源上运行jar(或war) 由package阶段。 要在命令行上使用此目标,您必须包含package阶段:mvn package spring-boot:repackage.
如果您正在使用spring-boot-starter-parent,则此类执行已经预先配置了repackage执行 ID,以便只添加插件定义。

上面的示例将jarwar在 Maven 生命周期的包阶段构建的 archive 中,包括任何provided在项目中定义的依赖项。 如果需要排除其中一些依赖项,您可以使用exclude选项;有关更多详细信息,请参阅依赖项排除

原始 (不可执行) 构件文件将重命名为.original默认情况下,但也可以使用自定义分类器保留原始构件。

outputFileNameMapping的特性maven-war-plugin当前不受支持。

spring-boot-devtoolsspring-boot-docker-compose默认情况下,模块会自动排除(您可以使用excludeDevtoolsexcludeDockerCompose属性)。 为了使它与warpackaging 中,使用spring-boot-devtoolsspring-boot-docker-composedependencies 必须设置为optional或使用provided范围。

该插件会重写您的清单,特别是管理Main-ClassStart-Class条目。 如果默认值不起作用,则必须在 Spring Boot 插件中配置值,而不是在 jar 插件中配置值。 这Main-Class在 manifest 中由layoutSpring 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属性默认为由归档类型 (jarwar).以下布局可用:

分层 Jar 或 War

重新打包的 jar 包含应用程序的类和依赖项BOOT-INF/classesBOOT-INF/lib分别。 同样,可执行的 war 包含应用程序的类WEB-INF/classes和依赖项WEB-INF/libWEB-INF/lib-provided. 对于需要从 jar 或 war 的内容构建 docker 镜像的情况,能够进一步分离这些目录以便将它们写入不同的层非常有用。

分层存档使用与常规重新打包的 jar 或 war 相同的布局,但包含一个描述每个层的附加元数据文件。

默认情况下,定义了以下图层:

通过查看属于当前版本的所有模块来识别模块依赖项。 如果模块依赖项只能因为它已安装到 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.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>

layersXML 格式分为三个部分:

嵌 套<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.5.0-SNAPSHOT

重新打包现有的 JAR 和 WAR 存档,以便可以使用java -jar.跟layout=NONE也可以简单地用于打包具有嵌套依赖项的 JAR(并且没有主类,因此不是可执行文件)。

必需参数

名字 类型 默认值

outputDirectory (输出目录)

File

${project.build.directory}

可选参数

名字 类型 默认值

附加

boolean

true

分类

String

embeddedLaunchScript

File

embeddedLaunchScriptProperties

Properties

excludeDevtools

boolean

true

excludeDockerCompose 的

boolean

true

excludeGroupIds

String

排除

List

可执行

boolean

false

includeSystemScope

boolean

false

include工具

boolean

true

包括

List

Layers

布局

LayoutType

布局工厂

LayoutFactory

loader实现

LoaderImplementation

main类

String

outputTimestamp (输出时间戳)

String

${project.build.outputTimestamp}

需要解压缩

List

boolean

false

参数详情

attach

将重新打包的存档附加到本地 Maven 存储库或部署到远程存储库。如果未配置分类器,它将替换普通的 jar。如果classifier已配置,使得普通 jar 和重新打包的 jar 不同,它将与普通 jar 一起附加。当属性设置为false,则不会安装或部署重新打包的存档。

名字

attach

类型

boolean

默认值

true

用户属性

因为

1.4.0

classifier

Classifier 添加到重新打包的存档中。如果未给出,则 main artifact 将被 repackaged archive 替换。如果给定,则分类器也将用于确定要重新打包的源存档:如果已经存在具有该分类器的工件,则它将被用作源并替换。如果不存在此类工件,则主工件将用作源,并且重新打包的档案将作为该分类器的补充工件附加。附加工件允许将其与原始工件一起部署,有关更多详细信息,请参阅 Maven 文档。

名字

classifier

类型

java.lang.String

默认值

用户属性

因为

1.0.0

embeddedLaunchScript

嵌入式启动脚本,如果 jar 是完全可执行的,则将其预置到 jar 的前面。如果未指定,则将使用 'Spring Boot' 默认脚本。

名字

embeddedLaunchScript

类型

java.io.File

默认值

用户属性

因为

1.3.0

embeddedLaunchScriptProperties

应在嵌入式启动脚本中展开的属性。

名字

embeddedLaunchScriptProperties

类型

java.util.Properties

默认值

用户属性

因为

1.3.0

excludeDevtools

从重新打包的存档中排除 Spring Boot devtools。

名字

excludeDevtools

类型

boolean

默认值

true

用户属性

spring-boot.repackage.excludeDevtools

因为

1.3.0

excludeDockerCompose

从重新打包的存档中排除 Spring Boot 开发服务。

名字

excludeDockerCompose

类型

boolean

默认值

true

用户属性

spring-boot.repackage.excludeDockerCompose

因为

3.1.0

excludeGroupIds

要排除的 groupId 名称的逗号分隔列表(完全匹配)。

名字

excludeGroupIds

类型

java.lang.String

默认值

用户属性

spring-boot.excludeGroupIds

因为

1.1.0

excludes

要排除的项目定义的集合。这Exclude元素定义 mandatorygroupIdartifactId组件和可选的classifier元件。当配置为属性时,值应使用冒号分隔的组件进行逗号分隔:groupId:artifactId,groupId:artifactId:classifier

名字

excludes

类型

java.util.List

默认值

用户属性

spring-boot.excludes

因为

1.1.0

executable

通过在 jar 中预置启动脚本,为 *nix 计算机创建一个完全可执行的 jar。目前,某些工具不接受此格式,因此您可能并不总是能够使用此技术。例如jar -xf可能会静默地无法提取已完全可执行的 jar 或 war。建议您仅在打算直接执行此选项时启用此选项,而不是使用java -jar或将其部署到 servlet 容器。

名字

executable

类型

boolean

默认值

false

用户属性

因为

1.3.0

includes

要包含的项目定义的集合。这Include元素定义 mandatorygroupIdartifactId组件和可选的classifier元件。当配置为属性时,值应使用冒号分隔的组件进行逗号分隔:groupId:artifactId,groupId:artifactId:classifier

名字

includes

类型

java.util.List

默认值

用户属性

spring-boot.includes

因为

1.2.0

layers

图层配置,其中包含用于禁用图层创建、排除图层工具 jar 和提供自定义图层配置文件的选项。

名字

layers

类型

org.springframework.boot.maven.Layers

默认值

用户属性

因为

2.3.0

layout

存档的类型(对应于其中依赖项的布局方式)。可能的值为JAR,WAR,ZIP,DIR,NONE.默认为基于存档类型的猜测。

名字

layout

类型

org.springframework.boot.maven.AbstractPackagerMojo$LayoutType

默认值

用户属性

spring-boot.repackage.layout

因为

1.0.0

layoutFactory

如果未设置显式布局,则将用于创建可执行存档的布局工厂。替代布局实现可由第三方提供。

名字

layoutFactory

类型

org.springframework.boot.loader.tools.LayoutFactory

默认值

用户属性

因为

1.5.0

mainClass

主类的名称。如果未指定,则找到的第一个编译类包含main方法。

名字

mainClass

类型

java.lang.String

默认值

用户属性

因为

1.0.0

outputDirectory

包含生成的存档的目录。

名字

outputDirectory

类型

java.io.File

默认值

${project.build.directory}

用户属性

因为

1.0.0

outputTimestamp

可重现输出存档条目的时间戳,格式为 ISO 8601 (yyyy-MM-dd’T’HH:mm:ssXXX) 或int表示自 epoch 以来的秒数。

名字

outputTimestamp

类型

java.lang.String

默认值

${project.build.outputTimestamp}

用户属性

因为

2.3.0

requiresUnpack

必须从 uber jar 中解压缩才能运行的库列表。将每个库指定为<dependency>替换为<groupId>以及<artifactId>它们将在运行时解压缩。

名字

requiresUnpack

类型

java.util.List

默认值

用户属性

因为

1.1.0

例子

自定义分类器

默认情况下,repackagegoal 将原始工件替换为重新打包的工件。 对于代表应用程序的模块来说,这是一种合理的行为,但如果您的模块用作另一个模块的依赖项,则需要为重新打包的模块提供分类器。 这样做的原因是应用程序类被打包在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-parentrepackagegoal 在 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 对应部分。 两者都将以透明方式安装/部署。

如果要以与替换主构件相同的方式重新打包辅助构件,也可以使用相同的配置。 以下配置安装/部署单个taskclassified 工件替换为重新打包的应用程序:

<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-pluginspring-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.

本地重新打包的工件

默认情况下,repackagegoal 将原始工件替换为可执行工件。 如果您只需要部署原始 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) 中。 如果只有一个自定义LayoutFactory在插件 classpath 上,它列在META-INF/spring.factories那么就没有必要在 plugin 配置中显式设置它。

如果设置了显式布局,则始终忽略布局工厂。

依赖项排除

默认情况下,repackagerungoals 将包括任何provided在项目中定义的依赖项。 Spring Boot 项目应考虑provideddependencies 指定为运行应用程序所需的 “container” 依赖项。 一般来说, Spring Boot 项目不用作依赖项,因此不太可能有任何依赖项optional依赖。 当项目确实具有可选依赖项时,它们也将包含在repackagerun目标。

其中一些依赖项可能根本不是必需的,应该从可执行 jar 中排除。 为了保持一致性,在运行应用程序时也不应存在它们。

有两种方法可以在运行时排除依赖项的打包/使用:

以下示例排除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-toolsjar 将作为依赖项添加到您的存档中。 在 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.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.acmegroupId 的 ID 中。


APP信息