如何在 Maven 中讀取外部屬性文件
1. 概述
Maven 是一種流行的建置和依賴管理器,廣泛應用於 Java 開發。此外,我們可以在 Maven 中建立自訂屬性。
在建立 Java 應用程式時,我們經常依賴屬性檔案來儲存配置值。
在本教程中,我們將探討如何在 Maven 中讀取外部屬性檔案並有效地使用它。
2.問題介紹
為了理解這個問題,讓我們建立一個簡單的 Maven 專案:
.
├── pom.xml
├── props
│ └── user.properties
└── src
└── main
└── resources
└── result.txt
由於我們希望專注於 Maven,因此我們的專案不包含任何 Java 程式碼。該專案在src/main/resources
目錄下包含一個pom.xml
和一個result.txt
檔案。
我們準備了一個屬性檔props/user.properties
:
$ cat props/user.properties
my.name=Kai
my.hobbies=Reading, Tennis, Football
my.signature=vim rocks
我們將嘗試在建置專案時要求 Maven 讀取此屬性檔案。
為了簡單地驗證 Maven 是否可以載入users.properties
文件,我們先建立一個文字檔案src/main/resources/result.txt
其中包含一些${…}
佔位符:
Greeting message: ${greeting}
-----------------------------
Username is ${my.name}
His hobbies are ${my.hobbies}
He came in and said: "${my.signature}"
然後,我們將利用Maven 核心插件之一的 resources Maven 插件來result.txt
src/main/resources
目錄中的result.txt 。值得一提的是,資源過濾預設是在process-resources
階段執行的。
接下來我們來看看如何在pom.xml
檔中設定資源外掛:
<project>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven.resources.version}</version>
<configuration>
<outputDirectory>${project.build.outputDirectory}/filtered-result</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<greeting>Hi there, how are you</greeting>
</properties>
</project>
我們在pom.xml
中宣告一個名為greeting
的屬性。此外,我們要求資源外掛程式過濾src/main/resources
目錄中的文件,並將結果放置在${project.build.outputDirectory}/filtered-result
下。
現在,如果我們對process-resources
執行 Maven 指令,Maven 只知道我們在pom.xml
檔中定義的greeting
屬性:
$ mvn clean process-resources
[INFO] Scanning for projects...
[INFO] ------------------< com.baeldung:external-properties >------------------
[INFO] Building external-properties 0.0.1-SNAPSHOT
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
$ cat target/classes/filtered-result/result.txt
Greeting message: Hi there, how are you
-----------------------------
Username is ${my.name}
His hobbies are ${my.hobbies}
He came in and said: "${my.signature}"
接下來,讓我們看看如何讓 Maven 在建置過程中讀取外部屬性檔案並使其值可供使用。
3. 使用 Properties Maven 插件
Maven 屬性外掛程式是一個強大的工具,用於讀取屬性並將其註入到建置過程中。接下來我們來看看如何使用這個外掛來解決我們的問題。
3.1.配置屬性 Maven 插件
首先,讓我們在pom.xml
檔案中配置屬性外掛程式並讀取user.properties
檔案:
<project>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>${properties.plugin.version}</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>${user.properties.file}</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<greeting>Hi there, how are you</greeting>
<user.properties.file>props/user.properties</user.properties.file>
<properties.plugin.version>1.2.1</properties.plugin.version>
</properties>
</project>
正如我們所看到的,我們在<plugins>
標籤中聲明了屬性插件。由於我們希望在建置開始時載入屬性文件,因此我們將插件設定為在initialize
階段運行read-project-properties
目標。
此外,在此範例中,我們透過內部屬性${user.properties.file}
指定<configuration>
標記中的檔案。
接下來,讓我們建立專案:
$ mvn clean process-resources
[INFO] Scanning for projects...
[INFO] ------------------< com.baeldung:external-properties >------------------
[INFO] Building external-properties 0.0.1-SNAPSHOT
...
[INFO] --- properties:1.2.1:read-project-properties (default) @ external-properties ---
[INFO] Loading 3 properties from File: /.../external-properties-file/props/user.properties
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
建置日誌顯示屬性插件已從預期檔案載入了三個屬性。但讓我們驗證一下result.txt
是否被正確過濾:
$ cat target/classes/filtered-result/result.txt
Greeting message: Hi there, how are you
-----------------------------
Username is Kai
His hobbies are Reading, Tennis, Football
He came in and said: "vim rocks"
如輸出所示,建置過程已有效載入內部和外部屬性。
3.2.將屬性檔傳遞到 Maven 命令列
我們已經了解如何使用屬性 Maven 插件來載入外部屬性檔案。然而,有時,在pom.xml
中硬編碼檔案路徑很不方便。例如,我們可能想要動態選擇一個屬性檔案來建立我們的專案。
讓我們建立一個新的屬性檔:
props
├── liam.properties
└── user.properties
$ cat props/liam.properties
my.name=Liam
my.hobbies=Music, Football, Computer Games
my.signature=Maven rocks
現在,我們希望 Maven 載入liam.properties.
為此,我們**可以在建置專案時將檔案傳遞到 Maven 命令列**:
$ mvn -Duser.properties.file=props/liam.properties clean process-resources
[INFO] Scanning for projects...
[INFO] ------------------< com.baeldung:external-properties >------------------
[INFO] Building external-properties 0.0.1-SNAPSHOT
...
[INFO] --- properties:1.2.1:read-project-properties (default) @ external-properties ---
[INFO] Loading 3 properties from File: /.../external-properties-file/props/liam.properties
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
然後,我們在target
目錄中得到預期的result.txt
:
$ cat target/classes/filtered-result/result.txt
Greeting message: Hi there, how are you
-----------------------------
Username is Liam
His hobbies are Music, Football, Computer Games
He came in and said: "Maven rocks"
這種方法使建置過程更加靈活。
4. 結論
在本文中,我們探討如何利用屬性 Maven 插件將外部屬性整合到我們的 Maven 建置中。這種方法有助於管理特定於環境的構建,確保我們的專案保持乾淨、可維護和適應性強。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。