讀古今文學網 > Maven實戰 > 14.3 資源過濾 >

14.3 資源過濾

為了應對環境的變化,首先需要使用Maven屬性將這些將會發生變化的部分提取出來。在上一節的數據庫配置中,連接數據庫使用的驅動類、URL、用戶名和密碼都可能發生變化,因此用Maven屬性取代它們:

這裡定義了4個Maven屬性:db.driver、db.url、db.username和db.password,它們的命名是任意的,讀者可以根據自己的實際情況定義最合適的屬性名稱。

既然使用了Maven屬性,就應該在某個地方定義它們。14.1節介紹過如何自定義Maven屬性,這裡要做的是使用一個額外的profile將其包裹,如代碼清單14-4所示。

代碼清單14-4 針對開發環境的數據庫配置

代碼清單14-4中的Maven屬性定義與直接在POM的properties元素下定義並無二致,這裡只是使用了一個id為dev的profile,其目的是將開發環境下的配置與其他環境區別開來。關於profile,本章將詳細解釋。

有了屬性定義,配置文件中也使用了這些屬性,一切OK了嗎?還不行。讀者要留意的是,Maven屬性默認只有在POM中才會被解析。也就是說,${db.username}放到POM中會變成test,但是如果放到src/main/resources/目錄下的文件中,構建的時候它將仍然還是${db.username}。因此,需要讓Maven解析資源文件中的Maven屬性。

資源文件的處理其實是maven-resources-plugin做的事情,它默認的行為只是將項目主資源文件複製到主代碼編譯輸出目錄中,將測試資源文件複製到測試代碼編譯輸出目錄中。不過只要通過一些簡單的POM配置,該插件就能夠解析資源文件中的Maven屬性,即開啟資源過濾。

Maven默認的主資源目錄和測試資源目錄的定義是在超級POM中(可以回顧8.5節)。要為資源目錄開啟過濾,只要在此基礎上添加一行filtering配置即可,如代碼清單14-5所示。

代碼清單14-5 為主資源目錄開啟過濾

類似地,代碼清單14-6中的配置為測試資源目錄開啟了過濾。

代碼清單14-6 為測試資源目錄開啟過濾

讀者可能還會從上述代碼中意識到,主資源目錄和測試資源目錄都可以超過一個,雖然會破壞Maven的約定,但Maven允許用戶聲明多個資源目錄,並且為每個資源目錄提供不同的過濾配置,如代碼清單14-7所示。

代碼清單14-7 配置多個資源目錄

代碼清單14-7配置了兩個資源目錄,其中src/main/resources開啟了過濾,而src/main/sql沒有啟用過濾。

到目前為止一切基本就緒了,我們將數據庫配置的變化部分提取成了Maven屬性,在POM的profile中定義了這些屬性的值,並且為資源目錄開啟了屬性過濾。最後,只需要在命令行激活profile,Maven就能夠在構建項目的時候使用profile中屬性值替換數據庫配置文件中的屬性引用。運行命令如下:

mvn的-P參數表示在命令行激活一個profile。這裡激活了id為dev的profile。構建完成後,輸出目錄中的數據庫配置就是開發環境的配置了: