每一个项目都会有多套运行环境(开发,测试,正式等等),不一样的环境配置也不尽相同(如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>