【轉載:https://blog.csdn.net/blueheart20/article/details/52838093】apache
1. Maven中的profile設置maven
Maven是目前主流的項目代碼結構管理工具和打包發佈工具,在其中提供了profile方式,能夠將不一樣的環境下的信息,基於profile來進行管理,全部的配置信息放入profile以內;工具
你們能夠把profile看成一套環境下的獨立一套配置來理解。單元測試
示例以下, pom.xml中的配置部份內容:測試
<project>
<!-- 省略其餘部份內容 --->
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<ab.key>testkey</ab.key>
</properties>
<build>
<filters>
<filter>src/main/resources/config/db.properties</filter>
<filter>src/main/resources/config/test.xml</filter>
</filters>
</build>
</profile>
<profile>
<id>test</id>
<properties>
<ab.key>anothertestkey</ab.key>
</properties>
<build>
<filters>
<filter>src/main/resources/config/db.properties</filter>
<filter>src/main/resources/config/test.xml</filter>
</filters>
</build>
</profile>
</profiles>
</project>
這裏使用了ab.key來表示不一樣環境下的配置信息,你們能夠看到不一樣配置環境下的擁有相同key的值是各不相同的, testkey和anothertestkey.ui
<activation>標籤下的內容標識爲在基於mvn的命令操做狀況下,默認的profile指定,在命令行若是沒有指定profile,則默認使用activeByDefault中設定的profile值。url
2. Profile實現配置信息動態過濾的依賴包spa
主要的plugins以下所示:.net
<project> <!--這裏省略其餘部分的內容 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.0.1</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/resources</directory> <!-- <includes> <include>**/*</include> </includes> --> <filtering>true</filtering> </resource> </resources> </build>
maven-surefire-plugin, 可選組件, 插件用來在maven構建生命週期的test phase執行一個應用的單元測試。它會產生兩種不一樣形式的測試結果報告。插件
使用方式: 使用該插件很簡單,使用mvn surefire:test或者mvn test均可以運行工程下的單元測試。
結果信息: 在工程的${basedir}/target/surefire-reports,目錄下(basedir指的是pom文件所在的目錄)
主頁地址: http://maven.apache.org/components/plugins/maven-surefire-plugin/
maven-resources-plugin: 必選組件, 基於profile指定動態過濾配置信息
使用方式: mvn package -P profileName (or mvn deploy etc)
結果信息: 將src/main/resources下的配置信息佔位符替換爲profile中指定的值
主頁地址: http://maven.apache.org/components/plugins/maven-resources-plugin/
關於resources節點下的信息做用,這裏是整個resources的總開關,filtering這裏指定啓用過濾功能,不然該功能將沒法正常使用。 <directory>節點設定了掃描的目錄,includes節點主要是從總體的角度設定具體的掃描目錄或者文件;若是這裏不指定的話,能夠在各個profile之中指定具體須要掃描的配置文件,在build->filters->filter中指定特定的配置文件, 具體信息能夠參照#1中的pom.xml示例。
#1中的resources filter設置以下:
............ <profile> <id>test</id> <properties> <ab.key>anothertestkey</ab.key> </properties> <build> <filters> <filter>src/main/resources/config/db.properties</filter> <filter>src/main/resources/config/test.xml</filter> </filters> </build> </profile> ...............
3. profile文件使用示例
3.1 建立maven項目
打開Eclipse, 打開File--> New--> Maven Project, 建立maven項目:
填寫相應的項目groupId和artifactId信息:
點擊Finish按鈕以後,建立項目成功
3.2 項目結構以及相應的配置文件信息
這裏咱們將配置文件test.xml和db.properties放入了src/main/resources目錄下的config中。
同時將maven的plugins按照#1的要求配置進入pom.xml文件中。pom.xml的具體信息以下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.test</groupId> <artifactId>mymaven</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>mymaven</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.0.1</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/resources</directory> <!-- <includes> <include>**/*</include> </includes> --> <filtering>true</filtering> </resource> </resources> </build> <profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <ab.key>testkey</ab.key> </properties> <build> <filters> <filter>src/main/resources/config/db.properties</filter> <filter>src/main/resources/config/test.xml</filter> </filters> </build> </profile> <profile> <id>test</id> <properties> <ab.key>anothertestkey</ab.key> </properties> <build> <filters> <filter>src/main/resources/config/db.properties</filter> <filter>src/main/resources/config/test.xml</filter> </filters> </build> </profile> </profiles> </project>
配置文件中的信息以下, test.xml中的內容:
<?xml version="1.0" encoding="UTF-8"?> <info>${ab.key}</info>
db.properties中的內容以下:
my.key2=${ab.key}
ab.key在pom.xml中的不一樣profile中設定的相應值。
在pom.xml中設定了2個profile, test和dev, dev作爲缺省的profile。
4. 執行打包或者發佈操做,查看打包結果
>> mvn clean # 清理上次打包的結果和臨時文件
>> mvn package -P dev -Dmaven.test.skip=true # 打包,忽略測試部分
而後接入生成的target目錄,查看classes目錄下的config, 查看db.properties和test.xml中的內容:
maven的命令運行過程信息:
而後咱們就能夠在打包以後的結果中,看到過濾以後的信息了。
在Maven中-DskipTests和-Dmaven.test.skip=true的區別以下:
5. 在過程當中碰到的問題以及解決辦法
Q1: 在打包過程當中,發現配置信息,並未被正確的profile下的信息替換掉
How to fix it?
a. 檢查maven中的resources plugin是否被正確的引入, 在全局的filtering設置是否被打開,在build節點中的directory目錄設置是否正確。另外,在特定的profile中設置的filter路徑以及文件是否正確等
Q2: 在打包過程當中,配置文件被正確過濾替換了,可是配置文件不是被複制到特定的目錄,好比config下,而是被放入了classes下的根目錄了,爲何?
How to fix it ?
此類狀況應是build-->resources下設置了includes信息,include了全部的文件或者include文件路徑爲缺省值,好比下面的設置:
..................... <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> <filtering>true</filtering> </resource> </resources> </build> </project>
這種狀況下,將includes節點去掉,在profile中進行配置filter便可。
Q3: 個人配置都是沒有問題,可是依然發現配置文件中的佔位符,沒有被正確替換,問題在哪裏?
How to fix it ?
請檢查maven-resources-plugin是否被正確的引入到plugins的列表中。