知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 自動屬性擴展

Spring Boot
HongKong
5
02:24 PM · Dec 06 ,2025

1. 概述

在本文中,我們將探討通過 Maven 和 Gradle 構建方法,Spring 提供的屬性擴展機制。

2. Maven

Maven 是一個強大的項目構建工具,用於管理 Java 項目的構建過程。它提供了一個標準化的項目結構,並簡化了依賴管理、編譯、測試和打包等任務。

Maven 的核心概念包括:

  • Repository (倉庫): Maven 使用倉庫來存儲和管理項目依賴項。常見的倉庫類型包括本地倉庫、中央倉庫和遠程倉庫。
  • POM (Project Object Model): POM 文件是 Maven 項目的核心配置文件,它描述了項目的元數據、依賴項、構建配置等信息。
  • Lifecycle (生命週期): Maven 定義了一套標準的構建生命週期,包括編譯、測試、打包和部署等階段。
  • Plugins (插件): Maven 允許使用插件來擴展其功能,例如代碼分析、代碼生成、報告生成等。

以下是一個簡單的 Maven POM 文件示例:

<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

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 父項目的情況下,我們需要手動配置此過濾和擴展功能。我們需要將 resources 元素包含到 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>     

在插件中:

<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 解決方案

Gradle 從 Spring Boot 文檔提供的 解決方案 與 Maven 屬性過濾和展開不完全兼容。

為了允許我們使用屬性展開機制,我們需要將以下代碼包含到 build.gradle 中:

processResources {
    expand(project.properties)
}

這是一個有限的解決方案,與 Maven 默認配置存在以下差異:

  1. 不支持帶有句點(例如 user.name)的屬性。Gradle 將句點理解為對象屬性分隔符
  2. 過濾所有資源文件,而不僅僅是特定配置文件的集合
  3. 使用默認的美元符號佔位符 ${…},從而與標準 Spring 佔位符衝突

3.2. Maven 兼容解決方案

為了複製標準的 Maven 解決方案並利用 <em @…@ 樣式的佔位符,我們需要將以下代碼添加到我們的 <i 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])
            }
        }
    }
}

這將解決所有項目的屬性。我們仍然不能使用點來定義屬性(例如 user.name)在 build.gradle 中,但現在可以使用 gradle.properties 文件來定義屬性,並採用標準的 Java 屬性格式,同時它也支持帶有點屬性(例如 database.url)。

此構建僅過濾項目配置文件,而不過濾所有資源,並且與 Maven 解決方案完全兼容。

4. 結論

在本快速教程中,我們學習瞭如何使用 Maven 和 Gradle 構建方法自動擴展 Spring Boot 屬性,以及如何輕鬆地在兩者之間進行遷移。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.