强悍的长颈鹿 · openwrt在sd卡上装mysql_(转载 ...· 1 月前 · |
活泼的黄花菜 · 2018届毕业合影-兰州大学物理学院· 4 月前 · |
听话的眼镜 · 怪童漫画免费 - 怪童漫画 - ...· 1 年前 · |
坚强的山楂 · 如何评价电影《多力特的奇幻冒险》? - 知乎· 1 年前 · |
spring-boot:repackage
attach
classifier
embeddedLaunchScript
embeddedLaunchScriptProperties
excludeDevtools
excludeGroupIds
excludes
executable
includeSystemScope
includes
layers
layout
layoutFactory
mainClass
outputDirectory
outputTimestamp
requiresUnpack
If you use a milestone or snapshot release, you also need to add the appropriate
pluginRepository
elements, as shown in the following listing:
<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>
Maven users can inherit from the
spring-boot-starter-parent
project to obtain sensible defaults.
The parent project provides the following features:
A dependency management section, inherited from the
spring-boot-dependencies
POM, that manages the versions of common dependencies.
This dependency management lets you omit
<version>
tags for those dependencies when used in your own POM.
An execution of the
repackage
goal
with a
repackage
execution id.
A
native
profile that configures the build to be able to generate a Native image.
Sensible resource filtering .
Sensible plugin configuration ( Git commit ID , and shade ).
Sensible resource filtering for
application.properties
and
application.yml
including profile-specific files (for example,
application-dev.properties
and
application-dev.yml
)
application.properties
and
application.yml
files accept Spring style placeholders (
${…}
), the Maven filtering is changed to use
@
[email protected]
placeholders.
(You can override that by setting a Maven property called
resource.delimiter
.)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.5</version>
</parent>
With that setup, you can also override individual dependencies by overriding a property in your own project.
For instance, to use a different version of the SLF4J library and the Spring Data release train, you would add the following to your
pom.xml
:
<properties>
<slf4j.version>1.7.30</slf4j.version>
<spring-data-releasetrain.version>Moore-SR6</spring-data-releasetrain.version>
</properties>
Browse the
Dependency versions Appendix
in the Spring Boot reference for a complete list of dependency version properties.
There may be reasons for you not to inherit from the
spring-boot-starter-parent
POM.
You may have your own corporate standard parent that you need to use or you may prefer to explicitly declare all your Maven configuration.
If you do not want to use the
spring-boot-starter-parent
, you can still keep the benefit of the dependency management (but not the plugin management) by using an
import
scoped dependency, as follows:
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.0.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
The preceding sample setup does not let you override individual dependencies by using properties, as explained above.
To achieve the same result, you need to add entries in the
dependencyManagement
section of your project
before
the
spring-boot-dependencies
entry.
For instance, to use a different version of the SLF4J library and the Spring Data release train, you could add the following elements to your
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>3.0.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
The plugin offers a number of user properties, starting with
spring-boot
, to let you customize the configuration from the command-line.
For instance, you could tune the profiles to enable when running the application as follows:
$ mvn spring-boot:run -Dspring-boot.run.profiles=dev,local
If you want to both have a default while allowing it to be overridden on the command-line, you should use a combination of a user-provided project property and MOJO configuration.
<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>
The above makes sure that
local
and
dev
are enabled by default.
Now a dedicated property has been exposed, this can be overridden on the command-line as well:
$ mvn spring-boot:run -Dapp.profiles=test
BuildImageMojo implementation
that forks the lifecycle to make sure that
package
ran. This goal is suitable for command-line invocation. If you need to configure a mojo
execution
in your build, use
BuildImageNoForkMojo
instead.
spring-boot:build-image-no-fork
BuildImageMojo implementation
that does not fork the lifecycle to make sure that
package
ran. This goal should be used when configuring a mojo
execution
in your build. To invoke the goal on the command-line, use
BuildImageForkMojo
instead.
Generate a
build-info.properties
file based on the content of the current
MavenProject
.
Display help information on spring-boot-maven-plugin. Call
mvn spring-boot:help -Ddetail=true -Dgoal=<goal-name>
to display parameter details.
Invoke the AOT engine on the application.
Invoke the AOT engine on tests.
Repackage existing JAR and WAR archives so that they can be executed from the command line using
java -jar
. With
layout=NONE
can also be used simply to package a JAR with nested dependencies (and no main class, so not executable).
Run an application in place.
Start a spring application. Contrary to the
run
goal, this does not block and allows other goals to operate on the application. This goal is typically used in integration test scenario where the application is started before a test suite and stopped after.
Stop an application that has been started by the "start" goal. Typically invoked once a test suite has completed.
The plugin can create executable archives (jar files and war files) that contain all of an application’s dependencies and can then be run with
java -jar
.
Packaging an executable archive is performed by the
repackage
goal, as shown in the following example:
<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>
The example above repackages a
jar
or
war
archive that is built during the package phase of the Maven lifecycle, including any
provided
dependencies that are defined in the project.
If some of these dependencies need to be excluded, you can use one of the
exclude
options; see the
dependency exclusion
for more details.
The original (that is non-executable) artifact is renamed to
.original
by default but it is also possible to keep the original artifact using a custom classifier.
Devtools is automatically excluded by default (you can control that using the
excludeDevtools
property).
In order to make that work with
war
packaging, the
spring-boot-devtools
dependency must be set as
optional
or with the
provided
scope.
The plugin rewrites your manifest, and in particular it manages the
Main-Class
and
Start-Class
entries.
If the defaults don’t work you have to configure the values in the Spring Boot plugin, not in the jar plugin.
The
Main-Class
in the manifest is controlled by the
layout
property of the Spring Boot plugin, as shown in the following example:
<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>
The
layout
property defaults to a value determined by the archive type (
jar
or
war
). The following layouts are available:
WAR
: executable WAR layout.
provided
dependencies are placed in
WEB-INF/lib-provided
to avoid any clash when the
war
is deployed in a servlet container.
ZIP
(alias to
DIR
): similar to the
JAR
layout using
PropertiesLauncher
.
NONE
: Bundle all dependencies and project resources. Does not bundle a bootstrap loader.
A repackaged jar contains the application’s classes and dependencies in
BOOT-INF/classes
and
BOOT-INF/lib
respectively.
Similarly, an executable war contains the application’s classes in
WEB-INF/classes
and dependencies in
WEB-INF/lib
and
WEB-INF/lib-provided
.
For cases where a docker image needs to be built from the contents of a jar or war, it’s useful to be able to separate these directories further so that they can be written into distinct layers.
Layered archives use the same layout as a regular repackaged jar or war, but include an additional meta-data file that describes each layer.
By default, the following layers are defined:
Module dependencies are identified by looking at all of the modules that are part of the current build. If a module dependency can only be resolved because it has been installed into Maven’s local cache and it is not part of the current build, it will be identified as regular dependency.
The layers order is important as it determines how likely previous layers can be cached when part of the application changes.
The default order is
dependencies
,
spring-boot-loader
,
snapshot-dependencies
,
application
.
Content that is least likely to change should be added first, followed by layers that are more likely to change.
The repackaged archive includes the
layers.idx
file by default.
To disable this feature, you can do so in the following manner:
<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>
Depending on your application, you may want to tune how layers are created and add new ones. This can be done using a separate configuration file that should be registered as shown below:
<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>
The configuration file describes how an archive can be separated into layers, and the order of those layers. The following example shows how the default ordering described above can be defined explicitly:
<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.0.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>
The
layers
XML format is defined in three sections:
The
<application>
block defines how the application classes and resources should be layered.
The
<dependencies>
block defines how dependencies should be layered.
The
<layerOrder>
block defines the order that the layers should be written.
Nested
<into>
blocks are used within
<application>
and
<dependencies>
sections to claim content for a layer.
The blocks are evaluated in the order that they are defined, from top to bottom.
Any content not claimed by an earlier block remains available for subsequent blocks to consider.
The
<into>
block claims content using nested
<include>
and
<exclude>
elements.
The
<application>
section uses Ant-style path matching for include/exclude expressions.
The
<dependencies>
section uses
group:artifact[:version]
patterns.
It also provides
<includeModuleDependencies />
and
<excludeModuleDependencies />
elements that can be used to include or exclude local module dependencies.
If no
<include>
is defined, then all content (not claimed by an earlier block) is considered.
If no
<exclude>
is defined, then no exclusions are applied.
Looking at the
<dependencies>
example above, we can see that the first
<into>
will claim all module dependencies for the
application.layer
.
The next
<into>
will claim all SNAPSHOT dependencies for the
snapshot-dependencies
layer.
The final
<into>
will claim anything left (in this case, any dependency that is not a SNAPSHOT) for the
dependencies
layer.
The
<application>
block has similar rules.
First claiming
org/springframework/boot/loader/**
content for the
spring-boot-loader
layer.
Then claiming any remaining classes and resources for the
application
layer.
<into>
blocks are defined is often different from the order that the layers are written.
For this reason the
<layerOrder>
element must always be included and
must
cover all layers referenced by the
<into>
blocks.
Repackage existing JAR and WAR archives so that they can be executed from the command line using
java -jar
. With
layout=NONE
can also be used simply to package a JAR with nested dependencies (and no main class, so not executable).
attach
Attach the repackaged archive to be installed into your local Maven repository or deployed to a remote repository. If no classifier has been configured, it will replace the normal jar. If a
classifier
has been configured such that the normal jar and the repackaged jar are different, it will be attached alongside the normal jar. When the property is set to
false
, the repackaged archive will not be installed or deployed.
classifier
Classifier to add to the repackaged archive. If not given, the main artifact will be replaced by the repackaged archive. If given, the classifier will also be used to determine the source archive to repackage: if an artifact with that classifier already exists, it will be used as source and replaced. If no such artifact exists, the main artifact will be used as source and the repackaged archive will be attached as a supplemental artifact with that classifier. Attaching the artifact allows to deploy it alongside to the original one, see the Maven documentation for more details .
executable
Make a fully executable jar for *nix machines by prepending a launch script to the jar. <p> Currently, some tools do not accept this format so you may not always be able to use this technique. For example,
jar -xf
may silently fail to extract a jar or war that has been made fully-executable. It is recommended that you only enable this option if you intend to execute it directly, rather than running it with
java -jar
or deploying it to a servlet container.
By default, the
repackage
goal replaces the original artifact with the repackaged one.
That is a sane behavior for modules that represent an application but if your module is used as a dependency of another module, you need to provide a classifier for the repackaged one.
The reason for that is that application classes are packaged in
BOOT-INF/classes
so that the dependent module cannot load a repackaged jar’s classes.
If that is the case or if you prefer to keep the original artifact and attach the repackaged one with a different classifier, configure the plugin as shown in the following example:
<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>
If you are using
spring-boot-starter-parent
, the
repackage
goal is executed automatically in an execution with id
repackage
.
In that setup, only the configuration should be specified, as shown in the following example:
<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>
This configuration will generate two artifacts: the original one and the repackaged counter part produced by the repackage goal. Both will be installed/deployed transparently.
You can also use the same configuration if you want to repackage a secondary artifact the same way the main artifact is replaced.
The following configuration installs/deploys a single
task
classified artifact with the repackaged application:
<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>
As both the
maven-jar-plugin
and the
spring-boot-maven-plugin
runs at the same phase, it is important that the jar plugin is defined first (so that it runs before the repackage goal).
Again, if you are using
spring-boot-starter-parent
, this can be simplified as follows:
<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>
<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>
This configuration will generate the repackaged artifact in
target/my-app.jar
.
By default, the
repackage
goal replaces the original artifact with the executable one.
If you need to only deploy the original jar and yet be able to run your app with the regular file name, configure the plugin as follows:
<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>
This configuration generates two artifacts: the original one and the executable counter part produced by the
repackage
goal.
Only the original one will be installed/deployed.
Spring Boot repackages the jar file for this project using a custom layout factory defined in the additional jar file, provided as a dependency to the build plugin:
<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>
The layout factory is provided as an implementation of
LayoutFactory
(from
spring-boot-loader-tools
) explicitly specified in the pom.
If there is only one custom
LayoutFactory
on the plugin classpath and it is listed in
META-INF/spring.factories
then it is unnecessary to explicitly set it in the plugin configuration.
Layout factories are always ignored if an explicit layout is set.
By default, both the
repackage
and the
run
goals will include any
provided
dependencies that are defined in the project.
A Spring Boot project should consider
provided
dependencies as "container" dependencies that are required to run the application.
Some of these dependencies may not be required at all and should be excluded from the executable jar. For consistency, they should not be present either when running the application.
There are two ways one can exclude a dependency from being packaged/used at runtime:
Exclude a specific artifact identified by
groupId
and
artifactId
, optionally with a
classifier
if needed.
Exclude any artifact belonging to a given
groupId
.
This example excludes any artifact belonging to the
com.example
group:
<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>
When a layered jar or war is created, the
spring-boot-jarmode-layertools
jar will be added as a dependency to your archive.
With this jar on the classpath, you can launch your application in a special mode which allows the bootstrap code to run something entirely different from your application, for example, something that extracts the layers.
If you wish to exclude this dependency, you can do so in the following manner:
<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>
The default setup splits dependencies into snapshot and non-snapshot, however, you may have more complex rules.
For example, you may want to isolate company-specific dependencies of your project in a dedicated layer.
The following
layers.xml
configuration shown one such setup:
<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.0.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>
The configuration above creates an additional
company-dependencies
layer with all libraries with the
com.acme
groupId.
The plugin can create an
OCI image
from a jar or war file using
Cloud Native Buildpacks
(CNB).
Images can be built on the command-line using the
build-image
goal.
This makes sure that the package lifecycle has run before the image is created.
build-image-no-fork
when binding the goal to the package lifecycle.
This goal is similar to
build-image
but does not fork the lifecycle to make sure
package
has run.
In the rest of this section,
build-image
is used to refer to either the
build-image
or
build-image-no-fork
goals.
While the buildpack runs from an
executable archive
, it is not necessary to execute the
repackage
goal first as the executable archive is created automatically if necessary.
When the
build-image
repackages the application, it applies the same settings as the
repackage
goal would, that is dependencies can be excluded using one of the exclude options, and Devtools is automatically excluded by default (you can control that using the
excludeDevtools
property).
The
build-image
goal requires access to a Docker daemon.
By default, it will communicate with a Docker daemon over a local connection.
This works with
Docker Engine
on all supported platforms without configuration.
Environment variables can be set to configure the
build-image
goal to use an alternative local or remote connection.
The following table shows the environment variables and their values:
DOCKER_HOST
URL containing the host and port for the Docker daemon - for example
tcp://192.168.99.100:2376
DOCKER_TLS_VERIFY
Enable secure HTTPS protocol when set to
1
(optional)
DOCKER_CERT_PATH
Path to certificate and key files for HTTPS (required if
DOCKER_TLS_VERIFY=1
, ignored otherwise)
Docker daemon connection information can also be provided using
docker
parameters in the plugin configuration.
The following table summarizes the available parameters:
URL containing the host and port for the Docker daemon - for example
tcp://192.168.99.100:2376
tlsVerify
Enable secure HTTPS protocol when set to
true
(optional)
certPath
Path to certificate and key files for HTTPS (required if
tlsVerify
is
true
, ignored otherwise)
bindHostToBuilder
When
true
, the value of the
host
property will be provided to the container that is created for the CNB builder (optional)
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
:
email
E-mail address for the Docker image registry user. Optional for user authentication.
token
Identity token for the Docker image registry user. Required for token authentication.
The plugin invokes a builder to orchestrate the generation of an image. The builder includes multiple buildpacks that can inspect the application to influence the generated image. By default, the plugin chooses a builder image. The name of the generated image is deduced from project properties.
The
image
parameter allows configuration of the builder and how it should operate on the project.
The following table summarizes the available parameters and their default values:
spring-boot.build-image.builder
)
Name of the Builder image to use.
paketobuildpacks/builder:base
runImage
(
spring-boot.build-image.runImage
)
Name of the run image to use.
No default value, indicating the run image specified in Builder metadata should be used.
(
spring-boot.build-image.imageName
)
Image name for the generated image.
docker.io/library/
${project.artifactId}:${project.version}
pullPolicy
(
spring-boot.build-image.pullPolicy
)
Policy
used to determine when to pull the builder and run images from the registry.
Acceptable values are
ALWAYS
,
NEVER
, and
IF_NOT_PRESENT
.
ALWAYS
Environment variables that should be passed to the builder.
buildpacks
Buildpacks that the builder should use when building the image. Only the specified buildpacks will be used, overriding the default buildpacks included in the builder. Buildpack references must be in one of the following forms:
bindings
Volume bind mounts that should be mounted to the builder container when building the image. The bindings will be passed unparsed and unvalidated to Docker when creating the builder container. Bindings must be in one of the following forms:
network
+ (
spring-boot.build-image.network
)
The network driver the builder container will be configured to use. The value supplied will be passed unvalidated to Docker when creating the builder container.
cleanCache
+ (
spring-boot.build-image.cleanCache
)
Whether to clean the cache before building.
false
verboseLogging
Enables verbose logging of builder operations.
false
publish
+ (
spring-boot.build-image.publish
)
Whether to publish the generated image to a Docker registry.
false
One or more additional tags to apply to the generated image.
The values provided to the
tags
option should be full image references in the form of
[image name]:[tag]
or
[repository]/[image name]:[tag]
.
caches
Cache volume names that should be used by the builder instead of generating random names.
buildCache
A cache containing layers created by buildpacks and used by the image building process.
A named volume in the Docker daemon, with a name derived from the image name.
launchCache
A cache containing layers created by buildpacks and used by the image launching process.
A named volume in the Docker daemon, with a name derived from the image name.
The plugin detects the target Java compatibility of the project using the compiler’s plugin configuration or the
maven.compiler.target
property.
When using the default Paketo builder and buildpacks, the plugin instructs the buildpacks to install the same Java version.
You can override this behaviour as shown in the
builder configuration
examples.
BuildImageMojo implementation
that forks the lifecycle to make sure that
package
ran. This goal is suitable for command-line invocation. If you need to configure a mojo
execution
in your build, use
BuildImageNoForkMojo
instead.
spring-boot:build-image-no-fork
org.springframework.boot:spring-boot-maven-plugin:3.0.5
BuildImageMojo implementation
that does not fork the lifecycle to make sure that
package
ran. This goal should be used when configuring a mojo
execution
in your build. To invoke the goal on the command-line, use
BuildImageForkMojo
instead.
This configuration will use a builder image with the name
mine/java-cnb-builder
and the tag
latest
, and the run image named
mine/java-cnb-run
and the tag
latest
.
The builder and run image can be specified on the command line as well, as shown in this example:
$ mvn spring-boot:build-image -Dspring-boot.build-image.builder=mine/java-cnb-builder -Dspring-boot.build-image.runImage=mine/java-cnb-run
If the builder exposes configuration options using environment variables, those can be set using the
env
attributes.
The following is an example of configuring the JVM version used by the Paketo Java buildpacks at build time:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<BP_JVM_VERSION>17</BP_JVM_VERSION>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
If there is a network proxy between the Docker daemon the builder runs in and network locations that buildpacks download artifacts from, you will need to configure the builder to use the proxy.
When using the Paketo builder, this can be accomplished by setting the
HTTPS_PROXY
and/or
HTTP_PROXY
environment variables as show in the following example:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<HTTP_PROXY>http://proxy.example.com</HTTP_PROXY>
<HTTPS_PROXY>https://proxy.example.com</HTTPS_PROXY>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
Paketo Java buildpacks
configure the JVM runtime environment
by setting the
JAVA_TOOL_OPTIONS
environment variable.
The buildpack-provided
JAVA_TOOL_OPTIONS
value can be modified to customize JVM runtime behavior when the application image is launched in a container.
Environment variable modifications that should be stored in the image and applied to every deployment can be set as described in the Paketo documentation and shown in the following example:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<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>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
By default, the image name is inferred from the
artifactId
and the
version
of the project, something like
docker.io/library/${project.artifactId}:${project.version}
.
You can take control over the name, as shown in the following example:
<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>
By default, the builder will use buildpacks included in the builder image and apply them in a pre-defined order. An alternative set of buildpacks can be provided to apply buildpacks that are not included in the builder, or to change the order of included buildpacks. When one or more buildpacks are provided, only the specified buildpacks will be applied.
The following example instructs the builder to use a custom buildpack packaged in a
.tgz
file, followed by a buildpack included in the builder.
<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 can be specified in any of the forms shown below.
A buildpack located in a CNB Builder (version may be omitted if there is only one buildpack in the builder matching the
buildpack-id
):
The generated image can be published to a Docker registry by enabling a
publish
option.
If the Docker registry requires authentication, the credentials can be configured using
docker.publishRegistry
parameters.
If the Docker registry does not require authentication, the
docker.publishRegistry
configuration can be omitted.
docker.example.com
in these examples).
If
docker.publishRegistry
credentials are configured and include a
url
parameter, this value is passed to the registry but is not used to determine the publishing registry location.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<name>docker.example.com/library/${project.artifactId}</name>
<publish>true</publish>
</image>
<docker>
<publishRegistry>
<username>user</username>
<password>secret</password>
</publishRegistry>
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
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
When using the
publish
option on the command line with authentication, you can provide credentials using properties as in this example:
$ mvn spring-boot:build-image \ -Ddocker.publishRegistry.username=user \ -Ddocker.publishRegistry.password=secret \ -Ddocker.publishRegistry.url=docker.example.com \ -Dspring-boot.build-image.publish=true \ -Dspring-boot.build-image.imageName=docker.example.com/library/my-app:v1
and reference the properties in the XML configuration:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<docker>
<publishRegistry>
<url>${docker.publishRegistry.url}</url>
<username>${docker.publishRegistry.username}</username>
<password>${docker.publishRegistry.password}</password>
</publishRegistry>
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
The CNB builder caches layers that are used when building and launching an image. By default, these caches are stored as named volumes in the Docker daemon with names that are derived from the full name of the target image. If the image name changes frequently, for example when the project version is used as a tag in the image name, then the caches can be invalidated frequently.
The cache volumes can be configured to use alternative names to give more control over cache lifecycle as shown in the following example:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<buildCache>
<volume>
<name>cache-${project.artifactId}.build</name>
</volume>
</buildCache>
<launchCache>
<volume>
<name>cache-${project.artifactId}.launch</name>
</volume>
</launchCache>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
The plugin can communicate with the Docker daemon provided by minikube instead of the default local connection.
On Linux and macOS, environment variables can be set using the command
eval $(minikube docker-env)
after minikube has been started.
The plugin can also be configured to use the minikube daemon by providing connection details similar to those shown in the following example:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<docker>
<host>tcp://192.168.99.100:2376</host>
<tlsVerify>true</tlsVerify>
<certPath>/home/user/.minikube/certs</certPath>
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
The plugin can communicate with a podman container engine .
The plugin can be configured to use podman local connection by providing connection details similar to those shown in the following example:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<docker>
<host>unix:///run/user/1000/podman/podman.sock</host>
<bindHostToBuilder>true</bindHostToBuilder>
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<docker>
<builderRegistry>
<username>user</username>
<password>secret</password>
<url>https://docker.example.com/v1/</url>
<email>
[email protected]
</email>
</builderRegistry>
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
If the builder or run image is stored in a private Docker registry that supports token authentication, the token value can be provided using
docker.builderRegistry
parameters as shown in the following example:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<docker>
<builderRegistry>
<token>9cbaf023786cd7...</token>
</builderRegistry>
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
Application arguments can be specified using the
arguments
parameter, see
using application arguments
for more details.
The application is executed in a forked process and setting properties on the command-line will not affect the application.
If you need to specify some JVM arguments (that is for debugging purposes), you can use the
jvmArguments
parameter, see
Debug the application
for more details.
There is also explicit support for
system properties
and
environment variables
.
As enabling a profile is quite common, there is dedicated
profiles
property that offers a shortcut for
-Dspring-boot.run.jvmArguments="-Dspring.profiles.active=dev"
, see
Specify active profiles
.
Spring Boot
devtools
is a module to improve the development-time experience when working on Spring Boot applications.
To enable it, just add the following dependency to your project:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
When
devtools
is running, it detects change when you recompile your application and automatically refreshes it.
This works for not only resources but code as well.
It also provides a LiveReload server so that it can automatically trigger a browser refresh whenever things change.
Devtools can also be configured to only refresh the browser whenever a static resource has changed (and ignore any change in the code). Just include the following property in your project:
spring.devtools.remote.restart.enabled=false
Prior to
devtools
, the plugin supported hot refreshing of resources by default which has now be disabled in favour of the solution described above.
You can restore it at any time by configuring your project:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
When
addResources
is enabled, any
src/main/resources
directory will be added to the application classpath when you run the application and any duplicate found in
target/classes
will be removed.
This allows hot refreshing of resources which can be very useful when developing web applications.
For example, you can work on HTML, CSS or JavaScript files and see your changes immediately without recompiling your application.
It is also a helpful way of allowing your front end developers to work without needing to download and install a Java IDE.
In order to be consistent with the
repackage
goal, the
run
goal builds the classpath in such a way that any dependency that is excluded in the plugin’s configuration gets excluded from the classpath as well.
For more details, see
the dedicated example
.
Sometimes it is useful to include test dependencies when running the application.
For example, if you want to run your application in a test mode that uses stub classes.
If you wish to do this, you can set the
useTestClasspath
parameter to true.
addResources
Add maven resources to the classpath directly, this allows live in-place editing of resources. Duplicate resources are removed from
target/classes
to prevent them from appearing twice if
ClassLoader.getResources()
is called. Please consider adding
spring-boot-devtools
to your project instead as it provides this feature and many more.
The
run
goal runs your application in a forked process.
If you need to debug it, you should add the necessary JVM arguments to enable remote debugging.
The following configuration suspend the process until a debugger has joined on port 5005:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
</jvmArguments>
</configuration>
</plugin>
</plugins>
</build>
</project>
These arguments can be specified on the command line as well, make sure to wrap that properly, that is:
$ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"
System properties can be specified using the
systemPropertyVariables
attribute.
The following example sets
property1
to
test
and
property2
to 42:
<project>
<build>
<properties>
<my.value>42</my.value>
</properties>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<property1>test</property1>
<property2>${my.value}</property2>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
</project>
If the value is empty or not defined (that is
<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 through 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 (for example 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"
Environment variables can be specified using the
environmentVariables
attribute.
The following example sets the 'ENV1', 'ENV2', 'ENV3', 'ENV4' env variables:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<environmentVariables>
<ENV1>5000</ENV1>
<ENV2>Some Text</ENV2>
<ENV3/>
<ENV4></ENV4>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build>
</project>
If the value is empty or not defined (that is
<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 (for example 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.
Application arguments can be specified using the
arguments
attribute.
The following example sets two arguments:
property1
and
property2=42
:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<arguments>
<argument>property1</argument>
<argument>property2=${my.value}</argument>
</arguments>
</configuration>
</plugin>
</plugins>
</build>
</project>
On the command-line, arguments are separated by a space the same way
jvmArguments
are.
If an argument contains a space, make sure to quote it.
In the following example, two arguments are available:
property1
and
property2=Hello World
:
$ mvn spring-boot:run -Dspring-boot.run.arguments="property1 'property2=Hello World'"
The active profiles to use for a particular application can be specified using the
profiles
argument.
The following configuration enables the
local
and
dev
profiles:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<profiles>
<profile>local</profile>
<profile>dev</profile>
</profiles>
</configuration>
</plugin>
</plugins>
</build>
</project>
The profiles to enable can be specified on the command line as well, make sure to separate them with a comma, as shown in the following example:
$ mvn spring-boot:run -Dspring-boot.run.profiles=local,dev
Spring AOT is a process that analyzes your application at build-time and generate an optimized version of it.
It is a mandatory step to run a Spring
ApplicationContext
in a native image.
The Spring Boot Maven plugin offers goals that can be used to perform AOT processing on both application and test code.
To configure your application to use this feature, add an execution for the
process-aot
goal, as shown in the following example:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<goals>
<goal>process-aot</goal>
</goals>
</execution>
</executions>
</plugin>
As the
BeanFactory
is fully prepared at build-time, conditions are also evaluated.
This has an important difference compared to what a regular Spring Boot application does at runtime.
For instance, if you want to opt-in or opt-out for certain features, you need to configure the environment used at build time to do so.
The
process-aot
goal shares a number of properties with the
run goal
for that reason.
If you use
spring-boot-starter-parent
as the
parent
of your project, a
native
profile can be used to streamline the steps required to build a native image.
The
native
profile configures the following:
Making sure the plugin uses the raw classpath, and not the main jar file as it does not understand our repackaged jar format.
Validate that a suitable GraalVM version is available.
Download third-party reachability metadata.
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>A single project can trigger the generation of a native image on the command-line using either Cloud Native Buildpacks or Native Image Build Tools .
To use the
native
profile with a multi-modules project, you can create a customization of the
native
profile so that it invokes your preferred technique.
To bind Cloud Native Buildpacks during the
package
phase, add the following to the root POM of your multi-modules project:
<profile>
<id>native</id>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>build-image</id>
<goals>
<goal>build-image-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
The example below does the same for Native Build Tools:
<profile>
<id>native</id>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<executions>
<execution>
<id>build-image</id>
<goals>
<goal>compile-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
Once the above is in place, you can build your multi-modules project and generate a native image in the relevant sub-modules, as shown in the following example:
$ mvn package -Pnative
The AOT engine can be applied to JUnit 5 tests that use Spring’s Test Context Framework.
Suitable tests are processed by the AOT engine in order to generate
ApplicationContextInitialzer
code.
To configure your application to use this feature, add an execution for the
process-test-aot
goal, as shown in the following example:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-test-aot</id>
<goals>
<goal>process-test-aot</goal>
</goals>
</execution>
</executions>
</plugin>
While you may start your Spring Boot application very easily from your test (or test suite) itself, it may be desirable to handle that in the build itself.
To make sure that the lifecycle of your Spring Boot application is properly managed around your integration tests, you can use the
start
and
stop
goals, as shown in the following example:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Such setup can now use the failsafe-plugin to run your integration tests as you would expect.
The application is started in a separate process and JMX is used to communicate with the application. By default, the plugin uses port
9001
.
If you need to configure the JMX port, see
the dedicated example
.
You could also configure a more advanced setup to skip the integration tests when a specific property has been set, see the dedicated example .
Spring Boot’s Parent POM,
spring-boot-starter-parent
, configures Failsafe’s
<classesDirectory>
to be
${project.build.outputDirectory}
.
Without this configuration, which causes Failsafe to use the compiled classes rather than the repackaged jar, Failsafe cannot load your application’s classes.
If you are not using the parent POM, you should configure Failsafe in the same way, as shown in the following example:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<classesDirectory>${project.build.outputDirectory}</classesDirectory>
</configuration>
</plugin>
Start a spring application. Contrary to the
run
goal, this does not block and allows other goals to operate on the application. This goal is typically used in integration test scenario where the application is started before a test suite and stopped after.
addResources
Add maven resources to the classpath directly, this allows live in-place editing of resources. Duplicate resources are removed from
target/classes
to prevent them from appearing twice if
ClassLoader.getResources()
is called. Please consider adding
spring-boot-devtools
to your project instead as it provides this feature and many more.
Stop an application that has been started by the "start" goal. Typically invoked once a test suite has completed.
One nice feature of the Spring Boot test integration is that it can allocate a free port for the web application.
When the
start
goal of the plugin is used, the Spring Boot application is started separately, making it difficult to pass the actual port to the integration test itself.
The example below showcases how you could achieve the same feature using the Build Helper Maven Plugin :
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>reserve-tomcat-port</id>
<goals>
<goal>reserve-network-port</goal>
</goals>
<phase>process-resources</phase>
<configuration>
<portNames>
<portName>tomcat.http.port</portName>
</portNames>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
<arguments>
<argument>--server.port=${tomcat.http.port}</argument>
</arguments>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<test.server.port>${tomcat.http.port}</test.server.port>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
You can now retrieve the
test.server.port
system property in any of your integration test to create a proper
URL
to the server.
The
jmxPort
property allows to customize the port the plugin uses to communicate with the Spring Boot application.
This example shows how you can customize the port in case
9001
is already used:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jmxPort>9009</jmxPort>
</configuration>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
The
skip
property allows to skip the execution of the Spring Boot maven plugin altogether.
This example shows how you can skip integration tests with a command-line property and still make sure that the
repackage
goal runs:
<project>
<properties>
<skip.it>false</skip.it>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
<skip>${skip.it}</skip>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
<configuration>
<skip>${skip.it}</skip>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<skip>${skip.it}</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
By default, the integration tests will run but this setup allows you to easily disable them on the command-line as follows:
$ mvn verify -Dskip.it=true
Spring Boot Actuator displays build-related information if a
META-INF/build-info.properties
file is present.
The
build-info
goal generates such file with the coordinates of the project and the build time.
It also allows you to add an arbitrary number of additional properties, as shown in the following example:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>build-info</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
<configuration>
<additionalProperties>
<encoding.source>UTF-8</encoding.source>
<encoding.reporting>UTF-8</encoding.reporting>
<java.source>${maven.compiler.source}</java.source>
<java.target>${maven.compiler.target}</java.target>
</additionalProperties>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
This configuration will generate a
build-info.properties
at the expected location with four additional keys.
maven.compiler.source
and
maven.compiler.target
are expected to be regular properties available in the project.
They will be interpolated as you would expect.
The
help
goal is a standard goal that displays information on the capabilities of the plugin.
spring-boot:help
org.springframework.boot:spring-boot-maven-plugin:3.0.5
Display help information on spring-boot-maven-plugin. Call
mvn spring-boot:help -Ddetail=true -Dgoal=<goal-name>
to display parameter details.