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} 形式的标准占位符,需设置 useDefaultDelimeterstrue,此时 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)
}

❌ 此方案存在以下限制:

  1. 不支持带点属性(如 user.name),Gradle 将点视为对象属性分隔符
  2. 过滤所有资源文件,而非仅限配置文件
  3. 使用默认的 ${...} 占位符,与 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 等效功能
  • 两种构建工具的配置方案可轻松迁移,确保属性展开行为一致

掌握这些技巧后,你就能在构建时动态注入项目属性,避免硬编码配置值,提升项目的可维护性。


原始标题:Automatic Property Expansion with Spring Boot | Baeldung