使用maven的profile構建不同環境配置的方法
最近使用到瞭maven的profile功能,發現這個功能的確很好用也很實用,這塊的知識比較多也比較亂,其實真正理解瞭之後非常簡單,為瞭鞏固總結知識,有個更清晰的知識體系,本文誕生瞭,希望能讓像我一樣零基礎的小白一看就懂,有請戲精,閃亮登場~~
1.背景
作為一名猿,在實際的項目開發中,通常會有很多配置環境,比如最基本的:開發、測試、生產;不同的環境,某些文件的配置是不一樣的(如:數據庫連接信息、properties文件的配置等),如果我們進行開發or測試時每次都得手動去修改配置文件,難免有些麻煩且容易出現問題(我反正是深有體會╥﹏╥),所以,當當當當~maven的profile功能就出現瞭。
2.Profile簡介
簡單說一下,maven的profile可以讓我們定義一系列的配置信息,然後指定其激活條件。這樣我們就可以定義多個profile,然後每個profile對應不同的激活條件和配置信息,從而達到不同環境使用不同配置信息的目的。
3.Profile在哪定義
一般來講,有三種地方可以定義,不同的地方,作用范圍不同,可配置項也不同;
- 針對於特定項目的profile配置,我們可以定義在該項目的pom.xml中。
- 針對於特定用戶的profile配置,我們可以在用戶的settings.xml文件中定義profile。該文件在用戶目錄下的“.m2”目錄下。
- 全局的profile配置。全局的profile是定義在Maven安裝目錄下的“conf/settings.xml”文件中的。
4.Profile使用實例
ps:前方將使用Eclipse來演示,主要以pom配置為主,重點涉及到瞭profile、filter、resource標簽,工程源代碼在文章最末尾。
過多的理論就不再說瞭,還是配合著實例代碼來看更容易理解一些。另外,構建不同的環境配置主要有兩種效果(或者叫實現方式):
– 第一種,根據不同的環境生成不同的配置文件(profile+resources);
– 第二種,根據不同的環境生成不同的配置內容,並替換原配置文件中的內容(profile+resources+filters);
什麼意思?可能比較抽象,別捉急,我們一個一個演示。哦對瞭,先放一張項目結構圖嘗嘗鮮(為瞭結構更清晰,我把單元測試的包刪瞭):
4.1 生成不同配置文件
本實例達到的效果是:根據不同的環境,動態打包生成不同環境下的 db.properties 文件。
(1)在pom.xml中的project
節點下配置profile
<profiles> <!-- 開發 --> <profile> <!-- profile的id --> <id>dev</id> <properties> <!-- 此處的jastar.env可以自定義,其他地方可以使用${jastar.env}來引用此屬性 --> <jastar.env>dev</jastar.env> </properties> <activation> <!-- 默認激活此配置 --> <activeByDefault>true</activeByDefault> </activation> </profile> <!-- 測試 --> <profile> <id>test</id> <properties> <jastar.env>test</jastar.env> </properties> </profile> <!-- 生產 --> <profile> <id>prd</id> <properties> <jastar.env>prd</jastar.env> </properties> </profile> </profiles>
(2)建立三種環境的資源文件夾,如下:
src/main/filters/dev src/main/filters/test src/main/filters/prd
並添加各自的db.properties
文件:
註意:maven標準目錄中,提供瞭一個filters目錄用於存放資源過濾文件。推薦在filters目錄下創建,而不是resources目錄,因為resources目錄中的文件默認情況下是不會被過濾的,還需在resources節點下額外的配置一些東西;這樣的話結構也較清晰,resource目錄存放公共資源文件,filters目錄存放不同環境差異化資源文件。
(3)配置maven-resources-plugin插件
在構建WAR包的時候會經過資源文件處理階段,maven-resources-plugin 則用來處理資源文件。在pom.xml中的build
節點下配置如下:
<plugins> <!-- 編譯插件,此處用來設置jdk的版本,否則默認的版本很低 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 資源文件處理插件,必須配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins>
(4)配置resources節點
在pom.xml中的build
節點下配置如下:
<!-- 最後生成的資源文件 --> <resources> <!-- 所有公共資源文件 --> <resource> <directory>src/main/resources</directory> </resource> <!-- 不同環境的資源文件 --> <resource> <directory>src/main/filters/${jastar.env}</directory> </resource> </resources>
(5)打包測試
至此,配置已經完成瞭,細心的童鞋會發現,我們maven update 項目之後,資源目錄會出現以下現象:
沒錯,這說明我們的配置生效瞭,因為默認的profile是dev,所以Eclipse會智能的把該目錄顯示在這裡。
好,接下來打包測試一下是否達到瞭我們的預期效果。右鍵項目Run AS,如下:
填寫maven命令後run:
運行完成刷新項目可以看到,target目錄下生成瞭“demo-maven-profile.war”文件,打開文件可以看到生成的屬性文件如下:
查看db.properties文件內容,perfect~當然,你們也可以試試指定其他profile,在此不再演示。
4.2 註入不同的配置內容
本實例達到的效果是:根據不同的環境,將
src/main/resources/log4j.properties
中的部分內容替換為src/main/filters/dev、test、prd/log4j.properties
中的內容。
(1)依然是先配置profile,上面已經配置過瞭,同上。
(2)新建src/main/resources/log4j.properties
文件如下:
(3)新建src/main/filters/dev、test、prd/log4j.properties
文件如下:
(4)重點來瞭,在pom.xml的build
節點下配置filters
節點和resources
節點,如下(註意註釋部分):
<!-- 此處定義變量配置文件地址 --> <filters> <!-- 註意如果配置瞭多個filter,並且他們包含有相同的key,則以後面的value為最終值 --> <filter>src/main/filters/${jastar.env}/log4j.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <!-- 這句配置是關鍵,表示該資源文件夾下要進行過濾操作 --> <filtering>true</filtering> </resource> <resource> <directory>src/main/filters/${jastar.env}</directory> </resource> </resources>
(5)打包測試
配置完成,接下來同樣以上面的方式打包,這裡我的profile填寫test,運行完成,打開war包,查看log4j.properties文件如下,可以看到log4j的部分內容被替換瞭,實驗成功!
5.擴展
5.1 Profile的激活方式
1. 使用 activeByDefault 設置激活
在以上的實例中,我們使用瞭以下方式設置瞭默認激活:
<activation> <activeByDefault>true</activeByDefault> </activation>
2. 在 settings.xml 中使用 activeProfiles 指定激活
profile配置如下:
<profiles> <profile> <id>profile1</id> <properties> <hello>lilei</hello> </properties> </profile> <profile> <id>profile2</id> <properties> <hello>hanmeimei</hello> </properties> </profile> </profiles>
激活如下(支持多個):
<activeProfiles> <activeProfile>profile1</activeProfile> </activeProfiles>
3. 在maven命令中使用參數顯示激活
Eclipse窗口式運行幫我們隱藏瞭很多東西,其實原始的 maven 命令應該是這樣寫的:
mvn clean package –Pprofile1
當然,也可以取消激活:
mvn clean package –P!profile1
還有激活多個:
mvn clean package -Pprofile1,profile2,!profile3
4. 根據環境來激活
profile一個非常重要的特性就是它可以根據不同的環境來激活,比如根據jdk的版本:
<!-- 如果jdk的版本為1.8則激活該profile --> <profiles> <profile> <id>profile1</id> <activation> <jdk>1.8</jdk> </activation> </profile> </profiles>
根據操作系統:
<profiles> <profile> <id>profile1</id> <activation> <os> <!-- 不必指定所有信息 --> <name>linux</name> <family>unix</family> <arch>amd64</arch> <version>3.19.0-30-generic</version> </os> </activation> </profile> </profiles>
根據環境變量:
<profiles> <profile> <id>profile1</id> <activation> <property> <name>debug</name> <value>true</value> </property> </activation> </profile> </profiles>
根據文件是否存在來激活:
<profiles> <profile> <id>profile1</id> <activation> <file> <missing>/path/to/missing/file</missing> <exists>/path/to/exists/file</exists> </file> </activation> </profile> </profiles>
不同類型的激活方式可以組合使用,但是隻有但兩個條件都匹配時才能激活。
5.2 關於Filter
Filter 是 maven 的 resource插件提供的功能,作用是用環境變量、pom文件裡定義的屬性和指定配置文件裡的屬性替換屬性(*.properties)文件裡的占位符(${jdbc.url})。
在src/main/resources
目錄有個配置文件jdbc.properties
,內容如下:
jdbc.url=${pom.jdbc.url} jdbc.username=${pom.jdbc.username} jdbc.passworkd=${pom.jdbc.password}
配置 resource 插件,啟用filtering功能並添加屬性到pom:
<project> ... <!-- 用pom裡定義的屬性做替換 --> <properties> <pom.jdbc.url>jdbc:mysql://127.0.0.1:3306/dev</pom.jdbc.url> <pom.jdbc.username>root</pom.jdbc.username> <pom.jdbc.password>123456</pom.jdbc.password> </properties> <build> ... <!-- 可以把屬性寫到文件裡,用屬性文件裡定義的屬性做替換 --> <filters> <filter>src/main/filters.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> ... </build> ... </project>
編譯包後 target 目錄下的 jdbc.properties :
jdbc.url=jdbc:mysql://127.0.0.1:3306/dev jdbc.username=root jdbc.passworkd=123456
文章到這裡就差不多瞭,最後,為各位小夥伴默默奉上源代碼:傳送門
到此這篇關於使用maven的profile構建不同環境配置的方法的文章就介紹到這瞭,更多相關maven profile構建不同環境配置內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- maven profile實現多環境配置的示例
- 帶你瞭解Java Maven的打包操作
- maven的pom.xml中profiles的作用詳解
- 詳解Maven profile配置管理及激活profile的幾種方式
- SpringBoot-application.yml多環境配置詳解