maven-help-plugin 插件
mvn help:system 查看Java系统属性,环境变量属性
mvn help:active-profiles 当前激活的profile
mvn help:all-profiles 列出当前所有profile
前言:
在项目开发过程中,都应该使用快照版本,Maven能够很智能地处理这种特殊的版本,解析项目各个模块最新的"快照"。当项目需要对外发布时,就提供一个稳定的版本,该版本应当永远只能定位到唯一的构件。而不是像快照版本那样,定位的构件随时可能发生变化。
快照对应了项目的开发过程,正式版本对应了项目的发布,代表某个时刻项目的状态。
理想的项目发布应该满足以下条件:
- 所有自动化测试全部通过
- 项目没有配置任何快照版本的依赖
- 项目没有配置任何快照版本的插件
- 项目所包含的代码已经全部提交到版本控制系统中
项目发布与标签(Tag)的关系:
版本控制系统记录代码的每一个变化,通常这些变化都维护在 主干(Trunk)中,但是当项目发布的时候,开发人员就应该使用标签记录这一特殊时刻项目的状态。这样就可以通过标签明确地从主干中标出这个源代码版本(项目状态),并放到单独的位置,在以后我们就可以快速地获取发布版本的源码。
Maven版本号定义约定
如:1.3.4-beta-2"1" 表示该版本是第一个重大版本"3" 表示这是基于重大版本的第三个次要版本"4" 表示该次要班恩的第四个增量版本"beta-2" 表示该次要版本的某一个里程碑
- 主版本:表示了项目的重大架构变更,如struts1何struts2
- 次版本:表示较大范围的功能增加和变化,及bug修复
- 增量版本:表示重大bug的修复,如1.5.0有个bug,快速修复后发布1.5.1版本
- 里程碑版本:指某个版本的里程碑。与正式版本相比,表示不是非常稳定,还需要很多测试
当用户在声明依赖后插件未声明版本时,Maven会根据版本号约定自动解析最新版本。
对于主版本,次版本和增量版本,比较是基于数字的:
对于里程碑版本,maven只进行简单的字符串比较:1.5>1.4>1.3.11>1.3.9
1.2-beta-3>1.2-beta-11
主干,标签与分支
- 主干(trunk):项目开发代码的主体,是从项目开始直到当前都处于活动的转台。从这里可以获得项目最新的源代码以及几乎所有变更历史
- 分支(branch):从主干的某个点分离出来的代码拷贝,通常可以在不影响主干的前提下在这里进行重大bug的修复,或者做一些实验性质的开发。如果分支达到了预期的目的,通常发生在这里的变更会被合并(merge)到主干中。
- 标签(tag):用来标识主干或者分支的某个点的状态,以代表项目的某个稳定状态,这通常就是版本发布时的状态。
![]()
自动化版本发布
使用Maven Release Plugin发布项目版本,该插件主要有三个目标,分别为:
- release:prepare 准备版本发,一次执行下列操作
- 检查项目是否有未提交的代码
- 检查项目是否有快照版本依赖
- 根据用户输入将快照版本升级为发布版本
- 将POM中SCM信息更新为标签地址
- 基于修改后的POM执行Maven构建
- 提交POM变更
- 基于用户输入为代码打标签
- 将代码从发布版本升级为新的快照版本
- 提交POM变更
- release:rollbace 回退上一步所执行的操作。将POM回退至release:prepare之前的状态,并提交。(不会删除生成的标签,需要手动删除)
- release:perform 执行版本发布。签出release:prepare生成的标签中的源代码,在此基础上执行mvn deploy命令
pom文件配置如下:![]()
- connection 元素表示一个只读的scm地址
- developerConnection 表示可写的scm地址
- url 表示可以在浏览器访问的scm地址
该配置只告诉了Maven当前代码的位置(主干),而版本发布还要涉及标签操作,需要配置Maven Release Plugin告诉其标签的基础目录,如:![]()
注意:
- 系统必须提供svn命令行工具,Maven需要svn命令行工具执行相关操作
- POM必须配置了可用的部署仓库,release:perform会执行deploy 操作将构件发布
release:prepare -DautoVersionSubmodules=true 表示所有子模块使用与父模块一致的发布版本
灵活的构件
开发环境,测试环境,生产环境中,数据库配置都不尽相同,项目构建时就需要能够识别所在的环境并使用正确的配置。Maven为了支持构建的灵活性,内置了三大特性,即属性,Profile和资源过滤。Maven属性
如:通过<properties>标签元素统一定义各个依赖的版本,或其他路径等。然后在POM其他地方使用 ${属性名}的方式来引用该属性好处:消除重复,减少版本升级的工作量,降低错误发生概率
Maven属性主要有以下6类:
- 内置属性:主要有两个常用内置属性 ${basedir} 表示项目根目录,即包含pom.xml文件的目录。${version}表示项目版本
- POM属性:通过该类属性引用POM文件中对应的元素的值,常用POM属性如下:
- ${project.build.sourceDirectory}:项目主源码路径,默认为 src/main/java/
- ${project.build.testSourceDirectory}:项目的测试源码目录,默认为 src/test/java/
- ${project.build.diredtory}:项目构建输出目录,默认target/
- ${project.outputDirectory}:主代码编译输出目录,默认target/classes/
- ${project.testOutputDirectory}:项目测试代码编译输出目录,默认target/test-classes/
- ${project.groupId}:项目的groupId
- ${project.artifactId}:项目的artifactId
- ${project.version}:项目的version,与${version}等价
- ${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}
- 自定义属性:在<properties>元素下自定义Maven属性
- Settings属性:与POM属性同理,用户使用以settings开头的属性引用settings.xml文件中的XML元素,如${settings.localRepository},指向本地仓库
- Java系统属性:所有Java系统属性都可以使用Maven属性引用,如:${user.home}指向了用户目录,使用 mvn help:system
- 环境变量属性:所有环境变量都可以使用以env.开头的maven属性进行引用。如:${env.JAVA_HOME}指代了JAVA_HOME环境变量的值。
应用案例:
- 在多模块项目中,模块之间依赖比较常见,这些模块通常使用同样的groupId和version。所以在配置依赖时可以使用POM属性进行简化
- 大量的Maven插件用到了Maven属性,这意味着在配置插件的时候同样可以使用Maven属性来方便地定义插件行为。
构件环境的差异
在不同的环境中,项目的源码应该使用不同的方式进行构建资源过滤:为了应对环境的变化,需要使用Maven属性将这些会发生变化的部分提取出来在proerties配置文件中配置对Maven属性的引用![]()
POM配置文件
如上配置完后还不行
Maven属性默认只有在POM中才会被解析。${db.url}只有在POM中才会被解析,在resources/目录下的properties文件中不会被解析,需要让maven解析资源文件中的maven属性
资源文件的处理是由maven-resourdces-plugin所完成。该插件默认行为只是将项目主资源文件复制到主代码编译输出目录中。需要主动配置来开启资源过滤,在插件上添加配置如下:
执行命令-P参数,以指定的profile配置中的值来替换数据文件中的maven属性引用
Profile
profile能够在构建的时候修改POM的一个子集,或者添加额外的配置元素,用户可以使用很多方式激活profile,以实现构建在不同环境下的移植。
profile激活方式:
1.命令行激活
使用mvn命令行参数 -P 加上profile的id来激活profile,多个id之间以逗号分隔。如激活 dev -x 和dev-y两个profilemvn clean install -Pdev-x,dev-y
2.settings文件显示激活如果希望某个profile默认一直处于激活状态
![]()
3.系统属性激活
可以配置当某系统属性存在的时候,自动激活profile
mvn clean install -Dtest=x 多个profile可以使用同一个系统属性
4.操作系统环境激活
5.文件存在与否激活
根据项目中某个文件存在与否来决定是否激活profile
6.默认激活
在定义profile的时候指定其默认激活
Profile的种类
根据具体的需要,可以在以下位置声明profile:
- pom.xml:该文件中声明的profile只对当前项目有效
- 用户settings.xml:~/.m2/settings.xml中的profile对本机上该用户所有的maven项目都有效
- 全局settings.xml:maven安装目录下conf/settings.xml中,对本机上所有maven项目有效
POM之外的profile只能定义如下几个属性![]()