目錄
- 背景
- 第一部分 基本配置介紹
- 第二部分 具體配置和注意事項
- 第三部分 讀取resources資源
- 參考文獻及資料
背景
通常Maven專案的檔案目錄結構如下:
# 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
檔案進行了定義,我們首先看一個案例:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>application.properties</exclude>
</excludes>
</resource>
</resources>
</build>
- 標籤
<directory>
指定資原始檔目錄; - 標籤
<include>
指定資原始檔目錄中,哪些檔案被打包。 - 標籤
<excludes>
指定資原始檔目錄中,哪些檔案不被打包。
特別的,標籤<filtering>
是一個bool
值,預設值為false
。在maven資原始檔中,支援使用變數placeholder
,例如資原始檔:
# application.properties
application.user=${username}
application.password=${password}
檔案中使用${keyword}
佔位符來標識變數。這時候可以在pom.xml
檔案中定義變數的取值:
<properties>
<username>mysql</username>
<password>password123</password>
</properties>
如果需要對配置檔案中變數進行替換實際值,就需要開啟<filtering>
,該值設定為true
。
第二部分 具體配置和注意事項
2.1 案例說明
根據上面的介紹,最開始例子中有兩段resource
的配置描述,分別的含義為:
-
第一個配置的含義是:在配置檔案目錄
src/main/resources
過濾掉其他檔案,只保留application.properties
檔案。並且開啟filtering
變數替換屬性。 -
第二個配置的含義是:在配置檔案目錄
src/main/resources
過濾掉application.properties
檔案,其他檔案均保留。並且關閉filtering
變數替換屬性。
需要特別注意的是,這裡兩個<resources>
都是對資源目錄<src/main/resources>
的配置定義,一個是保留application.properties
,一個是去除application.properties
。這樣兩個配置會不會衝突?實際上兩個配置是相容。最後是取兩個配置分別過濾的檔案集合的並集。
可以看一下例子,資源目錄src/main/resources
裡面有三個檔案:
application.yml
application.properties
application.xml
編譯後,target/classes
路徑中三個配置檔案都是有的。第一配置檔案過濾後檔案集合為{application.properties}
,第二個配置過濾後的集合為{application.yml,application.xml}
,最後取並集就得到了最後編譯結果。
2.2 正則過濾
在對資源目錄中檔案進行過濾時,還支援正規表示式。例如:
<include>**/*.xml</include>
這個表示式表示包含了資源目錄下面所有xml
檔案(以及子目錄下面)。
2.3 變數佔位符
這裡主要指的是<filtering>
的功能。例如下面的xml
檔案定義了一個研發<profile>
。
<profiles>
<profile>
<id>dev</id>
<properties>
<resource.delimiter>${}</resource.delimiter>
<username>mysql</username>
<password>password123</password>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
配置中定義的username
和password
兩個變數的值。使用package -P dev
編譯後,配置檔案中佔位符變數被替換:
application.user=mysql
application.password=password123
需要注意的是這裡增加了
<resource.delimiter>
標籤配置,定義了佔位符的格式。有些時候其他依賴包的pom
檔案也會指定佔位符的格式,就會造成格式不統一。例如:spring boot把預設的佔位符號${}改成了@var@。所以建議進行配置,否則容易環境"汙染"。
2.4 關於一個錯誤觀點的說明
有很多關於這個主題的文章(例如CSND
)中,認為同一個<resource>
中,若是<include>
和<exclude>
都存在的話,那就發生衝突了,這時會以<exclude>
為準。
關於這個論點,筆者實際做了實驗,同一個<resource>
中,同時配置了<include>
和<exclude>
。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.properties</include>
</includes>
<excludes>
<exclude>application.properties</exclude>
</excludes>
</resource>
</resources>
</build>
編譯結果,配置檔案沒有打包進入target/classes
。說明這個論點是有問題的。說明在同一個resource
中兩種配置是取交集的。
2.5 子目錄
資源目錄也是支援子目錄的。即可以在資源目錄下面建立子目錄,在打包過程中會保留子目錄結構。例如:
resources
-test
--app.xml
-application.yml
-application.properties
-application.xml
在專案編譯後,如果子目錄中資原始檔被保留,那麼子目錄的結構也是保留的。例如:
target
-classes
--test
---app.xml
-application.yml
-application.properties
-application.xml
第二部分 讀取resources資源
例如我們的配置檔案properties
型別的配置檔案,可以使用下面的語句進行讀取:
- 方法1,從編譯後的整個classes目錄下去找;
InputStream is = this.getClass().getResourceAsStream("/" +application.properties);
- 方法2,
ClassLoader
從整個classes目錄找;
InputStream is = this.getClass().getClassLoader().getResourceAsStream(application.properties);
讀取使用Java
的工具包java.util.Properties
:
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
更多關注公眾號: