使用插件
Maven 用户可以通过继承 spring-boot-starter-parent
项目来获得合理的默认配置。父项目提供了以下功能:
-
默认使用 Java 17 作为编译器级别。
-
使用 UTF-8 作为源码编码。
-
使用
-parameters
参数进行编译。 -
继承自
spring-boot-dependencies
POM 的依赖管理部分,用于管理常见依赖的版本。这种依赖管理允许你在自己的 POM 中使用这些依赖时省略<version>
标签。 -
使用
repackage
执行 ID 执行 repackage 目标。 -
配置了一个
native
配置文件,使构建能够生成 Native 镜像。 -
合理的 资源过滤 配置。
-
对
application.properties
和application.yml
进行合理的资源过滤,包括特定于配置文件的文件(例如,application-dev.properties
和application-dev.yml
)。
由于 application.properties
和 application.yml
文件接受 Spring 风格的占位符(${…}
),Maven 过滤已更改为使用 @..@
占位符。(你可以通过设置一个名为 resource.delimiter
的 Maven 属性来覆盖此行为。)
spring-boot-starter-parent
设置了 maven.compiler.release
属性,该属性会限制 --add-exports
、--add-reads
和 --patch-module
选项的使用,如果它们修改了系统模块。如果你需要使用这些选项,请取消设置 maven.compiler.release
:
<maven.compiler.release></maven.compiler.release>
然后配置 source
和 target
选项来代替:
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
继承 Starter 父 POM
要将你的项目配置为继承自 spring-boot-starter-parent
,请按如下方式设置 parent
:
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.2</version>
</parent>
你只需要在此依赖上指定 Spring Boot 的版本号即可。如果你导入了其他 starter,可以安全地省略版本号。
通过这种设置,你还可以通过覆盖自己项目中的属性来覆盖个别依赖项。例如,要使用不同版本的 SLF4J 库和 Spring Data 发布列车,你可以在 pom.xml
中添加以下内容:
<properties>
<slf4j.version>1.7.30</slf4j.version>
<spring-data-releasetrain.version>Moore-SR6</spring-data-releasetrain.version>
</properties>
浏览 依赖版本属性 部分,查看 Spring Boot 参考文档中完整的依赖版本属性列表。
不使用 Parent POM 的 Spring Boot
有时您可能不想继承 spring-boot-starter-parent
POM。例如,您可能需要使用公司自定义的标准父 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>3.4.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
上述示例设置并不能让您通过使用属性来覆盖单个依赖项,正如前文所述。要实现相同的效果,您需要在项目的 dependencyManagement
部分中 在 spring-boot-dependencies
条目之前添加相关条目。例如,如果您想使用不同版本的 SLF4J 库和 Spring Data 发布系列,您可以在 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.4.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在命令行中覆盖设置
该插件提供了许多以 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