Jade Dungeon

Maven资源文件

Filter 过滤资源文件中的变量

官方文档

注意

Filter文件的替换作用只对src/main/resources下的文件起作用, 对src/test/resources的内容不起替换

变量替换

文件src/main/resources/hello.txt中有变量nameuserid

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了就要出错, 所以要通过includeexclude来指定要加入或排除的文件:

<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的方法一

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) 」

eclipse中指定profile的方法二

只替换资源文件中的参数

结合前面的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还是productionsrc/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

目录上看起来是这样:

sample

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