Maven资源文件
Filter 过滤资源文件中的变量
注意
Filter文件的替换作用只对src/main/resources
下的文件起作用,
对src/test/resources
的内容不起替换
变量替换
文件src/main/resources/hello.txt
中有变量name
和userid
:
hello ${name}, your id is ${userid}
在POM.xml
中指定要过滤那些文件,:
<project> ... <name>My Resources Plugin Practice Project</name> ... <build> ... <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering><!-- using this --> </resource> ... </resources> ... </build> ... </project>
并且会把POM文件中name
标签的内容替换文件中的name
变量。
可以更加细致地定义,如果把hello.txt
中的变更名name
改为your.name
。可以
在POM文件中更加明确地定义:
<project> ... <properties> <your.name>world</your.name> </properties> ... </project>
在命令行中指定-D
参数,命令行里的参数会大于POM文件中的标签,比如覆盖前面
的name
标签:
mvn resources:resources -Dname=jade -Duserid=55
指定变量文件
可以把值都放在一个文件里:
your.name = world
指定这个文件
<project> ... <build> ... <filters> <filter>values-dev.properties</filter> </filters> ... </build> ... </project>
排除文件
有些文件不需要替换变量,尤其是一些二进制文件,如果被filter了就要出错,
所以要通过include
或exclude
来指定要加入或排除的文件:
<project> ... <build> ... <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <excludes> <exclude>**/*.xml</exclude> </excludes> </resource> ... </resources> ... </build> ... </project>
Profile配置不同的环境
- pom.xml中的profile对本工程有效
- 用户settings.xml对当前用户
-
M2_HOME/conf/settings.xml
对本系统上所有的都有效
激活profile的方式
通过参数-P
选择:
$mvn clean compile -Pdevelopment
或:
$mvn clean compile -Pproduction
同时指定多个时用逗号分开:
$mvn clean compile -Pdev-a,dev-b
也可以当在系统中有指定属性时自动激活profile:
<profiles> <profile> ... <activation> <property> <name>test</name> </property> </activation> ... </profile> </profiles>
或者属性值为指定值的激活:
<profiles> <profile> ... <activation> <property> <name>test</name> <value>x</value> </property> </activation> ... </profile> </profiles>
mvn clean install -Dtest=x
根据操作系统激活profile:
<profiles> <profile> ... <activation> <os> <name>Windows XP</name> <family>Windows</family> <arch>x86</arch> <version>5.1.2600</version> </os> </activation> ... </profile> </profiles>
根据是否有指定文件激活profile:
<profiles> <profile> ... <activation> <file> <missing>x.properties</missing> <exists>y.properties</exists> </file> </activation> ... </profile> </profiles>
查看已经激活的profile:
mvn help:active-profiles
列出所有的profile:
mvn help:all-profiles
eclipse中指定profile的方法一: 「project -> properties -> maven menu」
eclipse中指定profile的方法二: #「project -> Maven -> Enable Maven Dependency」 #「project -> Run As -> Run Configurations -> Maven Build -> Add a new build (set profile and goal) 」 #「Add a new build (set profile and goal) 」
只替换资源文件中的参数
结合前面的filter
替换参数,如果不同的环境下要用不同的参数,可以去掉POM文件
project/build/resource
里的filter
,在不同的profiles
里指定不同的filter
,
然后用activeByDefault
指定一个默认的:
<project> ... <profiles> <profile> <id>development</id> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <filters> <filter>profile-development.properties</filter> </filters> </build> </profile> <profile> <id>production</id> <build> <filters> <filter>profile-production.properties</filter> </filters> </build> </profile> </profiles> </project>
通过参数-P
选择:
$mvn clean compile -Pdevelopment
或:
$mvn clean compile -Pproduction
同时指定多个时用逗号分开:
$mvn clean compile -Pdev-a,dev-b
替换整个文件
有些时候替换文件中的参数不不够,要把整个文件都替换掉。
比如根据环境是dev
还是production
把src/main/resources/dev
或是
src/main/resources/product
中的全部文件放到src/main/resources
里。
<profiles> <profile> <id>dev</id> <properties> <package.environment>dev</package.environment> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <resources> <resource> <directory>src/main/resources/dev</directory> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>*.xml</include> </includes> </resource> </resources> </build> </profile> <profile> <id>product</id> <properties> <package.environment>product</package.environment> </properties> <build> <resources> <resource> <directory>src/main/resources/product</directory> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>*.xml</include> </includes> </resource> </resources> </build> </profile> </profiles>
组合Profile与TestNG
TestNG可以给测试分组,比如分成单元测试和耗时比较长的集成测试:
@test(groups = {"unit"}) ... @test(groups = {"intergration"})
在maven里默认办执行单元测试,如果有特别指定profile才执行集成测试:
<project> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <groups>unit</groups> </configuration> </plugin> </plugins> </build> <profiles> <profile> <id>full</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <groups>unit,integration</groups> </configuration> </plugin> </plugins> </build> </profile> </profiles> </project>
结合Filter和Profile分开环境差异
settings.properties
是配置文件,我们把其中与环境相关的内容抽出来:
CMSDB_ENDPOINT=${CMSDB_ENDPOINT}
qa.properties
是测试环境:
CMSDB_ENDPOINT=http://phx5qa01c-5fca.stratus.phx.qa.xx.com:8080/cms
dev.properties
是开发环境:
CMSDB_ENDPOINT=http://localhost:8080/cms
prod.properties
是生产环境:
CMSDB_ENDPOINT=http://cms.vip.stratus.xx.com/cms
目录上看起来是这样:
POM文件中指定不同环境中的配置
-
resources
指定要替换的文件 -
activation
指定替换的命令,如下例子中的配置mvn install -Denv=qa
时采用qa.properties
中的值。 -
activeByDefault
表示是否作为默认配置。如下面两个是等价的:-
mvn install
-
mvn install -Denv=dev
-
<profiles> <profile> <id>dev</id> <build> <filters> <filter>src/main/resources/filters/dev.properties</filter> </filters> <resources> <resource><!-- 对指定目录下的内容进行占位符替换 --> <directory>src/main/resources</directory><!-- 指定目录 --> <filtering>true</filtering> <!-- 过滤 --> <includes> <include>*.*</include> <!-- 匹配文件 --> </includes> </resource> </resources> </build> <activation> <activeByDefault>true</activeByDefault> <!-- 默认 --> <property> <name>env</name> <!-- 触发的开关名 --> <value>dev</value> <!-- 触发的开关值 --> </property> </activation> </profile> <profile> <id>qa</id> <build> <filters> <filter>src/main/resources/filters/qa.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <!-- optional --> <include>*.*</include> </includes> </resource> </resources> </build> <activation> <property> <name>env</name> <value>qa</value> </property> </activation> </profile> <profile> <id>prod</id> <build> <filters> <filter>src/main/resources/filters/prod.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <!-- optional --> <include>*.*</include> </includes> </resource> </resources> </build> <activation> <property> <name>env</name> <value>prod</value> </property> </activation> </profile> </profiles>
调用开关
mvn install mvn install -Denv=qa mvn install -Denv=prod
如果是在eclipse里:
右击工程 -> properties -> 左边的Maven -> 右边的 Active Maven Profiles