《Maven实战》--- 灵活的构建
一个优秀的构建系统必须足够灵活,它应该能够让项目在不同的环境下都能成功地构建,例如,典型的项目都会开发环境,测试环境和产品环境,这些环境的数据库配置不尽相同。
maven为了支持构建的灵活性,内置了三大特性,即属性,Profile和资源过滤
1. maven属性
maven有6类属性
- 内置属性:主要有两个常用的内置属性,${basedir}表示项目根目录,即包含pom.xml文件的目录,${version}表示项目版本
- POM属性:用户可以使用该类属性引用POM文件中对应元素的值,例如${project.artifactId}就对应类<project><artifactId>元素的值,常用包括
- ${project.build.sourceDirectory}:项目的主源码,默认为src/main/java
- ${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java
- ${project.build.directory}:项目构建输出目录,默认target
- ${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/
- ${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes/
- ${project.groupId}:项目的groupId
- ${project.artifactId}:项目的artifactId
- ${project.version}:项目的version
- ${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}
- 自定义属性:也就是在<properties>标签中定义的
- Settings属性:和POM属性同理,使用settings开头,引用settings.xml中元素的值
- Java系统属性:所有Java系统属性都可以使用Maven属性引用,例如:${user.home} 指向了用户目录
- 环境变量属性:所有环境变量都可以使用以env开头的maven属性引用,例如${env.JAVA_HOME}指向JAVA_HOME的环境变量的值
2. 构建环境的差异
在不同的环境中,项目的源码应该使用不同的方式进行构建,最常见的就是数据库的配置,dev环境和test环境是不同的,数据库也是不同的
2.1. 资源过滤
POM配置
|
db.properties
|
为了应对环境的变化,首先需要使用Maven属性将这些将会发生变化的部分提取除了,使用maven属性替代它们
首先假设在src/main/resources中有配置文件,里面配置了数据库连接的一些属性 db.properties,为了让这个配置可以灵活的改变,适应各个环境的变化,采用${},希望可以动态变化
但是maven的属性默认会在POM解析,在db.properties中还是${}
资源文件的处理其实是maven-resources-plugin做的事情,它默认的行为只是将项目主资源文件复制到主代码编译输出目录中,将测试资源文件复制到测试代码编译输出目录中,不过需要一些POM配置
那么只需要开启资源过滤即可,在resouce标签下,添加一行<filtering>true</filtering>
然后在构建时候 mvn clean install -pdev即可
3. Maven Profile
为了能让构建在各个环境下方便地移植,Maven引入了profile的概念,profile能够构建的时候修改POM的一个子集,或者添加额外的配置元素,用户可以使用很多方式激活profile,以实现在不同的环境下移植
POM配置
|
激活profile
- 命令行激活:mvn clean install -Pdev
- settings文件显示激活 <activeProfile>dev</activeProfile>
- 系统属性激活
- 操作系统环境激活
- 文件存在与否激活
- 默认激活:<activeByDefault>true</activeByDefault>