每一個項目都會有多套運行環境(開發,測試,正式等等),不一樣的環境配置也不盡相同(如jdbc.url),藉助Jenkins和自動部署提供的便利,咱們能夠把不一樣環境的配置文件單獨抽離出來,打完包後用對應環境的配置文件替換打包後的文件,其實maven已經給咱們提供了替換方案:profile + filtering
html
Filtering 是 maven 的 resource 插件 提供的功能,做用是用環境變量、pom文件裏定義的屬性和指定配置文件裏的屬性替換屬性(*.properties
)文件裏的佔位符(${jdbc.url}
),具體使用以下:
在src/main/resources
目錄有個配置文件jdbc.properties
,內容以下:mysql
jdbc.url=${pom.jdbc.url} jdbc.username=${pom.jdbc.username} jdbc.passworkd=${pom.jdbc.password}
配置 resource 插件,啓用filtering功能並添加屬性到pom:linux
<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
:spring
jdbc.url=jdbc:mysql://127.0.0.1:3306/dev jdbc.username=root jdbc.passworkd=123456
什麼是profile?
<profile>
就像<dependencies>
同樣是pom文件裏的一個xml元素,在profile裏幾乎能夠定義全部在pom裏的定義的內容(<dependencies>
,<properties>
,插件配置等等,不過不能再定義他本身了)。當一個profile被激活時,它定義的<dependencies>
,<properties>
等就會覆蓋掉原pom裏定義的相同內容,從而能夠經過激活不一樣的profile來使用不一樣的配置。sql
<!-- profile 的感性認識 --> <project> ... <profiles> <profile> <id>dev</id> <properties> <active.profile>dev</active.profile> <pom.jdbc.url>jdbc:mysql://127.0.0.1:3306/dev</pom.jdbc.url> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependencies> </profile> </profiles> <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> </dependencies> ... </project>
能夠在兩個位置配置profile:settings.xml
和 pom.xml
apache
settings.xml
裏定義的profile是全局的,對全部的項目均可用,在裏面定義的配置項也稍微少了些,只能定義遠程服務器的信息和屬性信息(<repositories>
,<pluginRepositories>
, <properties>
)。這些信息在pom.xml
裏也是能夠定義的。服務器
pom.xml
裏能夠定義的配置以下:maven
<repositories>
測試
<pluginRepositories>
ui
<dependencies>
<plugins>
<properties>
<modules>
<reporting>
<dependencyManagement>
<distributionManagement>
以及build下的:
<defaultGoal>
<resources>
<testResources>
<finalName>
若是profile被激活,profile裏的配置和原pom的配置會作覆蓋合併。
能夠經過多種方式激活profile(顯式的,隱式的)
經過maven 的-P
參數激活指定的profile,參數的值是profile的id,多個profile以逗號分割,若是不想激活某個默認的profile,就在它的id前加個!
mvn -U clean package -Ptest,local,!ignore
IDEA裏則能夠在 Maven Projects 裏直接勾選想要激活的profile
配置profile時,能夠在 <profile>
的 <activation>
元素下配置隱式激活的信息。
pom.xml
文件裏
<!-- 默認激活 --> <profiles> <profile> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles>
settings.xml
文件裏則是經過<activeProfiles>
來配置默認激活的profile列表
<activeProfiles> <activeProfile>artifactory</activeProfile> </activeProfiles>
<profiles> <profile> <activation> <os> <!-- 沒必要指定全部信息 --> <name>linux</name> <family>unix</family> <arch>amd64</arch> <version>3.19.0-30-generic</version> </os> </activation> </profile> </profiles>
關於OS值的更多信息能夠參考這裏
<!-- 若是jdk的版本爲1.8則激活該profile --> <profiles> <profile> <activation> <jdk>1.8</jdk> </activation> </profile> </profiles>
也能夠經過[1.6,1.8)
匹配多個jdk版本,關於匹配模式的詳細信息能夠參考這裏
<!-- 若是環境變量裏有`debug`且它的值爲`true`則激活 --> <!-- 也能夠不指定`<value>`元素, 則只有環境變量裏有`debug`就激活 --> <profiles> <profile> <activation> <property> <name>debug</name> <value>true</value> </property> </activation> </profile> </profiles>
mvn -U clean package -Ddebug=true
<profiles> <profile> <activation> <file> <missing>/path/to/missing/file</missing> <exists>/path/to/exists/file</exists> </file> </activation> ... </profile> </profiles>
不一樣類型的隱式激活方式能夠組合使用,如根據同時指定根據操做系統類型和JDK版原本激活profile,只有但兩個條件都匹配是才激活之。
思路:在不一樣的profile裏配置不一樣的屬性(properties),而後激活相應的profile,用其中的屬性去替換jdbc.properties裏的佔位符。
繼續使用介紹Filtering時的例子,如今添加三個profile配置,分別對應開發,測試,正式環境。
修改後的pom文件以下:
<project> ... <build> <filters> <filter>src/main/filters-${active.profile}.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> <profiles> <profile> <id>dev</id> <properties> <active.profile>dev</active.profile> </properties> <!-- 把當前profile設置爲默認profile,能夠同時這是多個爲默認--> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <active.profile>test</active.profile> </properties> </profile> <profile> <id>product</id> <properties> <active.profile>product</active.profile> </properties> </profile> ... </project>
而後在src/main
下新建三個文件:filters-dev.properties
,filters-test.properties
,filters-product.properties
,文件內容以下(以filters-dev.properties
爲例):
pom.jdbc.url=jdbc:mysql://127.0.0.1:3306/dev pom.jdbc.username=root pom.jdbc.password=123456
用 dev profile 打開發包mvn clean package -Pdev
, 打包後jdbc.properties
文件內容以下:
jdbc.url=jdbc:mysql://127.0.0.1:3306/dev jdbc.username=root jdbc.password=123456
若是不一樣的運行環境只是屬性值的不一樣,用上面的 profile + filtering
進行下變量替換能夠很好的知足打包需求,若是不是簡單的替換(如log4j.xml,開發環境只要輸出到標準輸出,測試和線上環境則還須要打到文件且文件的位置和策略也不相同),這個就須要藉助maven 的 ant 插件。src/main/resources
目錄下有三個log4j的配置文件,分別對應三個運行環境:
resources
├── log4j-product.xml
├── log4j-test.xml
└── log4j.xml
配置以下profile:
<profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>config.*.properties</exclude> <exclude>log4j-*.xml</exclude> </excludes> </resource> </resources> </build> </profile> <profile> <id>test</id> <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <phase>test</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <delete file="${project.build.outputDirectory}/log4j.xml"/> <delete file="${project.build.outputDirectory}/log4j-product.xml"/> <move file="${project.build.outputDirectory}/log4j-test.xml" tofile="${project.build.outputDirectory}/log4j.xml"/> </tasks> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> <profile> <id>product</id> <properties> <active.profile>product</active.profile> </properties> <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <phase>test</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <delete file="${project.build.outputDirectory}/log4j.xml"/> <delete file="${project.build.outputDirectory}/log4j-test.xml"/> <move file="${project.build.outputDirectory}/log4j-product.xml" tofile="${project.build.outputDirectory}/log4j.xml"/> </tasks> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>