一个项目从开发到最后发布上线,通常需要在多套不同的环境经受反复的测试和验证,例如开发环境、测试环境、预生产环境、生产环境等。项目部署到不同的环境时,项目的配置通常也是不同的,例如数据库的数据源配置等。maven提供了一套
profiles
配置,开发者可以在项目POM文件中预先定义好若干个不同环境的profile
配置,项目可以根据不同的构建参数来动态选择其中的一个环境设置。这就意味着相同的一套项目代码,可以在构建时根据传入的不同环境参数打出不同环境的软件包来。这也是maven竭力保证的软件可移植性。
多环境配置
项目pom.xml
配置示例如下:
<!-- 多环境构建配置 -->
<profiles>
<!-- 开发环境配置 -->
<profile>
<!-- 标识符, 可以通过 -P[id] 来激活 --> <!-- -Pdev -->
<id>dev</id>
<!-- 激活条件 -->
<activation>
<!-- 可以通过 -D[name]=[value] 来激活 --> <!-- -Denv=dev -->
<property>
<name>env</name>
<value>dev</value>
</property>
<!-- 默认激活 -->
<activeByDefault>true</activeByDefault>
</activation>
<!-- 自定义的属性, 可以通过 ${label} 来引用 --> <!-- ${jdbcUrl} -->
<properties>
<jdbcUrl>jdbc:mysql://localhost:3306/dev</jdbcUrl>
</properties>
</profile>
<!-- 测试环境配置 -->
<profile>
<!-- 标识符, 可以通过 -P[id] 来激活 --> <!-- -Ptest -->
<id>test</id>
<!-- 激活条件 -->
<activation>
<!-- 可以通过 -D[name]=[value] 来激活 --> <!-- -Denv=dev -->
<property>
<name>env</name>
<value>test</value>
</property>
</activation>
<!-- 自定义的属性, 可以通过 ${label} 来引用 --> <!-- ${jdbcUrl} -->
<properties>
<jdbcUrl>jdbc:mysql://localhost:3306/test</jdbcUrl>
</properties>
</profile>
</profiles>
自定义属性<properties>
需要配合<resources>
使用才能发挥作用:
<build>
<!-- 类路径资源配置, 最终输出到软件包中 -->
<resources>
<resource>
<!-- 资源目录路径, 此路径是相对当前POM文件的位置 -->
<directory>src/main/resources</directory>
<!-- filtering=true, 能够代入具体的值替换${label}占位符 -->
<filtering>true</filtering>
</resource>
</resources>
</build>
项目配置文件src/main/resources/environment.properties
的内容如下:
mysql.jdbc.url = ${jdbcUrl}
打包开发环境的软件包:
$ mvn clean -Pdev package
或:
$ mvn clean -Denv=dev package
打包测试环境的软件包:
$ mvn clean -Ptest package
或:
$ mvn clean -Denv=test package
配置的方式
maven支持的profile
配置方式主要有以下几种:
- 与项目相关的
profile
配置可以定义在项目pom.xml
文件中; - 与用户相关的
profile
配置可以定义在用户settings.xml
(%USER_HOME%/.m2/settings.xml
)文件中; - 全局的
profile
配置可以定义在全局settings.xml
(%MAVEN_HOME%/.m2/settings.xml
)文件中;
外部文件(用户或全局settings.xml
文件)方式配置的profile
是无法移植的。这种方式你只能通过配置<repositories>
、<pluginRepositories>
、<properties>
三个标签元素来影响构建的过程,但并不能改变构建最终输出的结果。
内嵌配置(项目pom.xml
文件)方式配置的profile
是在项目内部定义的,因此它具有良好的可移植性。这种方式你有更多的标签元素可选择,并且能够改变构建最终输出的结果。这些标签元素有:
<profile>
<!-- 参与构建的模块 -->
<modules>...</modules>
<!-- 构件依赖声明 -->
<dependencies>...</dependencies>
<!-- 构件依赖管理 -->
<dependencyManagement>...</dependencyManagement>
<!-- 构件发布管理 -->
<distributionManagement>...</distributionManagement>
<!-- 插件仓库 -->
<pluginRepositories>...</pluginRepositories>
<!-- 自定义属性 -->
<properties>...</properties>
<!-- 生成站点的报告信息 -->
<reporting>...</reporting>
<!-- 构件仓库 -->
<repositories>...</repositories>
<!-- 构建配置 -->
<build>
<!-- 默认的构建目标, 在命令行中如果直接执行mvn没有带生命周期阶段, 则默认执行此处配置的阶段 -->
<defaultGoal>...</defaultGoal>
<!-- 类路径资源 -->
<resources>...</resources>
<!-- 单元测试的类路径资源 -->
<testResources>...</testResources>
<!-- 打包的名称 -->
<finalName>...</finalName>
</build>
</profile>
激活方式
用户或全局settings.xml
以及项目pom.xml
的配置可以使用<activeByDefault>
来激活:
<profile>
<id>dev</id>
<activation>
<!-- 默认激活 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
用户或全局settings.xml
的配置还可以使用<activeProfiles>
来激活:
<profile>
<id>dev</id>
</profile>
<activeProfiles>
<!-- 根据ID标识符来激活 -->
<activeProfile>dev</activeProfile>
</activeProfiles>
命令行可以使用-P[id]
或-P [id]
或-P [id1,id2]
来激活:
<profile>
<id>dev</id>
</profile>
<profile>
<id>test</id>
</profile>
$ mvn clean -Pdev package
$ mvn clean -P dev package
$ mvn clean -P dev,test package
命令行还可以使用-D[name]=[value]
的方式来激活:
<profile>
<activation>
<property>
<name>env</name>
<value>dev</value>
</property>
</activation>
</profile>
$ mvn clean -Denv=dev package
查看激活
$ mvn help:active-profiles
输出信息示例如下:
The following profiles are active:
- jdk7-development (source: external)
- dev (source: org.fanlychie:maven-multiple-modules-sample:0.0.2-SNAPSHOT)
文档传送门:http://maven.apache.org/guides/introduction/introduction-to-profiles.html
文档传送门:http://maven.apache.org/pom.html#Profiles