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 默認配置存在以下差異:
- 不支持帶有句點(例如 user.name)的屬性。Gradle 將句點理解為對象屬性分隔符
- 過濾所有資源文件,而不僅僅是特定配置文件的集合
- 使用默認的美元符號佔位符 ${…},從而與標準 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 屬性,以及如何輕鬆地在兩者之間進行遷移。