2. Maven 构建方式
2.1 默认配置
使用 spring-boot-starter-parent
作为父项目的 Maven 项目无需额外配置即可启用属性展开功能:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
</parent>
现在可以通过 @...@
占位符展开项目属性。以下示例将 Maven 中的项目版本保存到配置文件:
[email protected]@
[email protected]@
✅ 注意:这些展开操作仅限用于以下配置文件:
**/application*.yml
**/application*.yaml
**/application*.properties
2.2 手动配置
当不使用 spring-boot-starter-parent
父项目时,需要手动配置过滤和展开机制。在 pom.xml
的 <build>
部分添加:
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
</resource>
</resources>
同时在 <plugins>
部分添加:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
⚠️ 如果需要使用 ${variable.name}
形式的标准占位符,需设置 useDefaultDelimeters
为 true
,此时 application.properties
应改为:
expanded.project.version=${project.version}
expanded.project.property=${custom.property}
3. Gradle 构建方式
3.1 标准 Gradle 方案
Spring Boot 官方文档提供的 Gradle 方案 与 Maven 的属性过滤不完全兼容。要在 Gradle 中启用属性展开,需在 build.gradle
添加:
processResources {
expand(project.properties)
}
❌ 此方案存在以下限制:
- 不支持带点属性(如
user.name
),Gradle 将点视为对象属性分隔符 - 过滤所有资源文件,而非仅限配置文件
- 使用默认的
${...}
占位符,与 Spring 标准占位符冲突
3.2 Maven 兼容方案
要实现与 Maven 完全兼容的 @...@
占位符方案,在 build.gradle
添加:
import org.apache.tools.ant.filters.ReplaceTokens
processResources {
with copySpec {
from 'src/main/resources'
include '**/application*.yml'
include '**/application*.yaml'
include '**/application*.properties'
project.properties.findAll().each {
prop ->
if (prop.value != null) {
filter(ReplaceTokens, tokens: [ (prop.key): prop.value])
filter(ReplaceTokens, tokens: [ ('project.' + prop.key): prop.value])
}
}
}
}
✅ 此方案优势:
- 支持所有项目属性展开
- 通过
gradle.properties
定义带点属性(如database.url
) - 仅过滤配置文件,不影响其他资源
- 与 Maven 方案 100% 兼容
4. 总结
本文详细介绍了在 Maven 和 Gradle 构建中实现 Spring Boot 自动属性展开的机制:
- Maven 方案通过
spring-boot-starter-parent
提供开箱即用支持 - Gradle 需要额外配置才能实现 Maven 等效功能
- 两种构建工具的配置方案可轻松迁移,确保属性展开行为一致
掌握这些技巧后,你就能在构建时动态注入项目属性,避免硬编码配置值,提升项目的可维护性。