maven(三)最詳細的profile的使用
前言
在開發過程中,我們的專案會存在不同的執行環境,比如開發環境、測試環境、生產環境,而我們的專案在不同的環境中,有的配置可能會不一樣,比如資料來源配置、日誌檔案配置、以及一些軟體執行過程中的基本配置,那每次我們將軟體部署到不同的環境時,都需要修改相應的配置檔案,這樣來回修改,很容易出錯,而且浪費勞動力。
在前面的文章profile之springboot,springboot為我們提供了一種解決方案,而maven也提供了一種更加靈活的解決方案,就是profile功能。
1. 原理
1.1 先看一段pom檔案中的profile定義
<profiles> <profile> <!--不同環境Profile的唯一id--> <id>dev</id> <properties> <!--profiles.active是自定義的欄位(名字隨便起),自定義欄位可以有多個--> <profiles.active>dev</profiles.active> </properties> </profile> <profile> <id>prod</id> <properties> <profiles.active>prod</profiles.active> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <profiles.active>test</profiles.active> </properties> </profile> </profiles>
可以看到定義了多個profile,每個profile都有唯一的id,也包含properties屬性。這裡為每個profile都定義一個名為profiles.active的properties,每個環境的值不同。當我們打包專案時,啟用不同的環境,profiles.active欄位就會被賦予不同的值。
1.2 結合resource屬性
這個profiles.active欄位可以應用到許多地方,及其靈活。可以在配置檔案裡被引用(參考此部落格);也可以結合pom檔案裡的resource和filter屬性,作為檔名的一部分或者資料夾名的一部分,下面會詳細講解這個用法。
注意:maven的profile用法有許多種,但基本原理就是根據啟用環境的不同,自定義欄位被賦予不同的值。
2. 應用演示
2.1 專案結構
這裡定義了dev,prod,test三個資料夾,用來演示maven中profile的使用。注意,每個資料夾裡還定義了application-{xxx}.properties件,這裡相當於結合springboot的Profile的使用,是我比較推薦的方式,和本文maven的profile使用無關係,在application.properties都有spring.profiles.active=xxx去載入對應的application-{xxx}.properties。
pom檔案裡的關鍵配置為
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <executable>true</executable> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/resources/</directory> <!--打包時先排除掉三個資料夾--> <excludes> <exclude>dev/*</exclude> <exclude>prod/*</exclude> <exclude>test/*</exclude> </excludes> <includes> <!--如果有其他定義通用檔案,需要包含進來--> <!--<include>messages/*</include>--> </includes> </resource> <resource> <!--這裡是關鍵! 根據不同的環境,把對應資料夾裡的配置檔案打包--> <directory>src/main/resources/${profiles.active}</directory> </resource> </resources> </build> <profiles> <profile> <!--不同環境Profile的唯一id--> <id>dev</id> <properties> <!--profiles.active是自定義的欄位,自定義欄位可以有多個--> <profiles.active>dev</profiles.active> </properties> </profile> <profile> <id>prod</id> <properties> <profiles.active>prod</profiles.active> </properties> <!--activation用來指定啟用方式,可以根據jdk環境,環境變數,檔案的存在或缺失--> <activation> <!--這個欄位表示預設啟用--> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <profiles.active>test</profiles.active> </properties> </profile> </profiles>
可以看到我們利用resource屬性來配置打包時,根據啟用的環境來選取要打包的資料夾。我們使用maven命令
mvn clean package
prod環境被預設啟用,打包後的包結構為
可以看到prod資料夾下的配置檔案被打包進去,通過啟用不同的profile也就實現了動態切換配置檔案。
2.2 啟用方式
profile的啟用方式有很多種
1. 通過maven命令引數
即在使用maven打包時通過-P引數,-P後跟上profile的唯一id,如
mvn clean package -Ptest
打包時test的profile被啟用,打包後的包結構為:
2. 通過pom檔案裡的activation屬性
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<!--activation用來指定啟用方式,可以根據jdk環境,環境變數,檔案的存在或缺失-->
<activation>
<!--配置預設啟用-->
<activeByDefault>true</activeByDefault>
<!--通過jdk版本-->
<!--當jdk環境版本為1.5時,此profile被啟用-->
<jdk>1.5</jdk>
<!--當jdk環境版本1.5或以上時,此profile被啟用-->
<jdk>[1.5,)</jdk>
<!--根據當前作業系統-->
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<!--通過系統環境變數,name-value自定義-->
<property>
<name>env</name>
<value>test</value>
</property>
<!--通過檔案的存在或缺失-->
<file>
<missing>target/generated-sources/axistools/wsdl2java/
com/companyname/group</missing>
<exists/>
</file>
</activation>
</profile>
這裡我寫了多種方式,可以通過activeByDefault、jdk版本、作業系統、系統環境變數(在win10我試了不成功,win7可以,不知道為啥)、檔案的存在或缺失,實際專案可以根據需要選取一種即可。這種的優先順序低於maven命令引數指定的方式。
3. settings.xml中使用activeProfiles指定(瞭解即可)
即mave目錄下的settings.xml也可以新增下面的程式碼來指定啟用哪個profile。
<activeProfiles>
<activeProfile>profileTest1</activeProfile>
</activeProfiles>
值得注意的是1. setting.xml在當前系統使用者的.m2資料夾有(如沒有可手動拷貝過去也會生效),針對的當前使用者的profile配置,在maven的安裝目錄下“conf/settings.xml”,針對的是全域性的profile配置。2.profile也可以定義在setting.xml檔案中,但是這種方式個人感覺並不實用的,不推薦。