1. 程式人生 > >Maven專案中resources配置總結

Maven專案中resources配置總結

## 目錄 - 背景 - 第一部分 基本配置介紹 - 第二部分 具體配置和注意事項 - 第三部分 讀取resources資源 - 參考文獻及資料 ## 背景 通常Maven專案的檔案目錄結構如下: ```shell # Maven專案的標準目錄結構 src main java #原始檔 resources #資原始檔 filters #資源過濾檔案 config #配置檔案 scripts #指令碼檔案 webapp #web應用檔案 test java #測試原始檔 resources #測試資原始檔 filters #測試資源過濾檔案 it #整合測試 assembly #assembly descriptors site #Site target generated-sources classes generated-test-sources test-classes xxx.jar pom.xml LICENSE.txt NOTICE.txt README.txt ``` 其中`src/main/resources`和`src/test/resources`是資原始檔目錄。本文將詳細介紹資原始檔相關的配置。 ## 第一部分 基本配置介紹 我們在使用Maven元件來構建專案的時候,通常將配置檔案放在資原始檔目錄下。針對這個目錄,在`pom.xml`檔案進行了定義,我們首先看一個案例: ```xml src/main/resources true application.properties src/main/resources false application.properties ``` - 標籤``指定資原始檔目錄; - 標籤` `指定資原始檔目錄中,哪些檔案被打包。 - 標籤``指定資原始檔目錄中,哪些檔案不被打包。 特別的,標籤``是一個`bool`值,預設值為`false`。在maven資原始檔中,支援使用變數`placeholder`,例如資原始檔: ```shell # application.properties application.user=${username} application.password=${password} ``` 檔案中使用`${keyword}`佔位符來標識變數。這時候可以在`pom.xml`檔案中定義變數的取值: ```xml mysql
password123
``` 如果需要對配置檔案中變數進行替換實際值,就需要開啟``,該值設定為`true`。 ## 第二部分 具體配置和注意事項 ### 2.1 案例說明 根據上面的介紹,最開始例子中有兩段`resource`的配置描述,分別的含義為: - 第一個配置的含義是:在配置檔案目錄`src/main/resources`過濾掉其他檔案,只保留`application.properties`檔案。並且開啟`filtering`變數替換屬性。 - 第二個配置的含義是:在配置檔案目錄`src/main/resources`過濾掉`application.properties`檔案,其他檔案均保留。並且關閉`filtering`變數替換屬性。 需要特別注意的是,這裡兩個``都是對資源目錄`
`的配置定義,一個是保留`application.properties`,一個是去除`application.properties`。這樣兩個配置會不會衝突?實際上兩個配置是相容。**最後是取兩個配置分別過濾的檔案集合的並集**。 可以看一下例子,資源目錄`src/main/resources`裡面有三個檔案: ```shell application.yml application.properties application.xml ``` 編譯後,`target/classes`路徑中三個配置檔案都是有的。第一配置檔案過濾後文件集合為`{application.properties}`,第二個配置過濾後的集合為`{application.yml,application.xml}`,最後取並集就得到了最後編譯結果。 ### 2.2 正則過濾 在對資源目錄中檔案進行過濾時,還支援正則表示式。例如: ```xml **/*.xml
``` 這個表示式表示包含了資源目錄下面所有`xml`檔案(以及子目錄下面)。 ### 2.3 變數佔位符 這裡主要指的是``的功能。例如下面的`xml`檔案定義了一個研發``。 ```xml dev ${} mysql password123 true ``` 配置中定義的`username`和`password`兩個變數的值。使用`package -P dev`編譯後,配置檔案中佔位符變數被替換: ```shell application.user=mysql application.password=password123 ``` > 需要注意的是這裡增加了``標籤配置,定義了佔位符的格式。有些時候其他依賴包的`pom`檔案也會指定佔位符的格式,就會造成格式不統一。例如:**spring boot把預設的佔位符號${}改成了@var@**。所以建議進行配置,否則容易環境"汙染"。 ### 2.4 關於一個錯誤觀點的說明 有很多關於這個主題的文章(例如`CSND`)中,認為同一個``中,若是``和``都存在的話,那就發生衝突了,這時會以``為準。 關於這個論點,筆者實際做了實驗,同一個``中,同時配置了``和``。 ```xml src/main/resources true application.properties application.properties ``` 編譯結果,配置檔案沒有打包進入`target/classes`。說明這個論點是有問題的。說明在**同一個`resource`中兩種配置是取交集的**。 ### 2.5 子目錄 資源目錄也是支援子目錄的。即可以在資源目錄下面建立子目錄,在打包過程中會保留子目錄結構。例如: ```shell resources -test --app.xml -application.yml -application.properties -application.xml ``` 在專案編譯後,如果子目錄中資原始檔被保留,那麼子目錄的結構也是保留的。例如: ```shell target -classes --test ---app.xml -application.yml -application.properties -application.xml ``` ## 第二部分 讀取resources資源 例如我們的配置檔案`properties`型別的配置檔案,可以使用下面的語句進行讀取: - 方法1,從編譯後的整個classes目錄下去找; ```java InputStream is = this.getClass().getResourceAsStream("/" +application.properties); ``` - 方法2,`ClassLoader`從整個classes目錄找; ```java InputStream is = this.getClass().getClassLoader().getResourceAsStream(application.properties); ``` 讀取使用`Java`的工具包`java.util.Properties`: ```java import java.util.Properties; Properties properties = new Properties(); InputStream is = this.getClass().getClassLoader().getResourceAsStream(application.properties); properties.load(is) //獲取配置檔案中name的配置值 System.out.println(properties.get(getProperty("name"))) ``` 其他型別的配置檔案讀取讀者可以執行查詢資料。 ## 參考文獻及資料 1、Maven Resources Plugin,連結:https://maven.apache.org/components/plugins-archives/maven-resources-plugin-2.6/ 2、Maven資源過濾的配置,連結:http://c.biancheng.net/view/5285.html 更多關注公眾號: ![](https://img2020.cnblogs.com/blog/1285229/202103/1285229-20210330214717143-6249822