每个项目都会有多套运行环境(开发,测试,正式等等),不同的环境配置也不尽相同(如jdbc.url),借助Jenkins和自动部署提供的便利,我们可以把不同环境的配置文件单独抽离出来,打完包后用对应环境的配置文件替换打包后的文件,其实maven已经给我们提供了替换方案:profile + filtering
Filtering 是 maven 的 resource 插件 提供的功能,作用是用环境变量、pom文件里定义的属性和指定配置文件里的属性替换属性(*.properties
)文件里的占位符(${jdbc.url}
),具体使用如下:
在src/main/resources
目录有个配置文件jdbc.properties
,内容如下:
jdbc.url=${pom.jdbc.url}
jdbc.username=${pom.jdbc.username}
jdbc.passworkd=${pom.jdbc.password}
配置 resource 插件,启用filtering功能并添加属性到pom:
<project>
...
<properties>
<pom.jdbc.url>jdbc:mysql://127.0.0.1:3306/devpom.jdbc.url>
<pom.jdbc.username>rootpom.jdbc.username>
<pom.jdbc.password>123456pom.jdbc.password>
properties>
<build>
...
<filters>
<filter>src/main/filters.propertiesfilter>
filters>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
...
build>
...
project>
编译包后target
目录下的jdbc.properties
:
jdbc.url=jdbc:mysql://127.0.0.1:3306/dev
jdbc.username=root
jdbc.passworkd=123456
什么是profile?
就像
一样是pom文件里的一个xml元素,在profile里几乎可以定义所有在pom里的定义的内容(
,
,插件配置等等,不过不能再定义他自己了)。当一个profile被激活时,它定义的
,
等就会覆盖掉原pom里定义的相同内容,从而可以通过激活不同的profile来使用不同的配置。
<project>
...
<profiles>
<profile>
<id>devid>
<properties>
<active.profile>devactive.profile>
<pom.jdbc.url>jdbc:mysql://127.0.0.1:3306/devpom.jdbc.url>
properties>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>3.2.4.RELEASEversion>
dependency>
<dependencies>
profile>
profiles>
<dependencies>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.14version>
dependency>
dependencies>
...
project>
可以在两个位置配置profile:settings.xml
和 pom.xml
settings.xml
里定义的profile是全局的,对所有的项目都可用,在里面定义的配置项也稍微少了些,只能定义远程服务器的信息和属性信息(
,
,
)。这些信息在pom.xml
里也是可以定义的。
pom.xml
里可以定义的配置如下:
以及build下的:
如果profile被激活,profile里的配置和原pom的配置会做覆盖合并。
可以通过多种方式激活profile(显式的,隐式的)
通过maven 的-P
参数激活指定的profile,参数的值是profile的id,多个profile以逗号分割,如果不想激活某个默认的profile,就在它的id前加个!
mvn -U clean package -Ptest,local,!ignore
IDEA里则可以在 Maven Projects 里直接勾选想要激活的profile
配置profile时,可以在
的
元素下配置隐式激活的信息。
pom.xml
文件里
<profiles>
<profile>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
profiles>
settings.xml
文件里则是通过
来配置默认激活的profile列表
<activeProfiles>
<activeProfile>artifactoryactiveProfile>
activeProfiles>
<profiles>
<profile>
<activation>
<os>
<name>linuxname>
<family>unixfamily>
<arch>amd64arch>
<version>3.19.0-30-genericversion>
os>
activation>
profile>
profiles>
关于OS值的更多信息可以参考这里
<profiles>
<profile>
<activation>
<jdk>1.8jdk>
activation>
profile>
profiles>
也可以通过[1.6,1.8)
匹配多个jdk版本,关于匹配模式的详细信息可以参考这里
<profiles>
<profile>
<activation>
<property>
<name>debugname>
<value>truevalue>
property>
activation>
profile>
profiles>
mvn -U clean package -Ddebug=true
<profiles>
<profile>
<activation>
<file>
<missing>/path/to/missing/filemissing>
<exists>/path/to/exists/fileexists>
file>
activation>
...
profile>
profiles>
不同类型的隐式激活方式可以组合使用,如根据同时指定根据操作系统类型和JDK版本来激活profile,只有但两个条件都匹配是才激活之。
思路:在不同的profile里配置不同的属性(properties),然后激活相应的profile,用其中的属性去替换jdbc.properties里的占位符。
继续使用介绍Filtering时的例子,现在添加三个profile配置,分别对应开发,测试,正式环境。
修改后的pom文件如下:
<project>
...
<build>
<filters>
<filter>src/main/filters-${active.profile}.propertiesfilter>
filters>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
build>
<profiles>
<profile>
<id>devid>
<properties>
<active.profile>devactive.profile>
properties>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
<profile>
<id>testid>
<properties>
<active.profile>testactive.profile>
properties>
profile>
<profile>
<id>productid>
<properties>
<active.profile>productactive.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>devid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<excludes>
<exclude>config.*.propertiesexclude>
<exclude>log4j-*.xmlexclude>
excludes>
resource>
resources>
build>
profile>
<profile>
<id>testid>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-pluginartifactId>
<executions>
<execution>
<phase>testphase>
<goals>
<goal>rungoal>
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>productid>
<properties>
<active.profile>productactive.profile>
properties>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-pluginartifactId>
<executions>
<execution>
<phase>testphase>
<goals>
<goal>rungoal>
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>
参考