Maven对项目版本的管理
Maven对项目版本的管理
版本号
版本号格式
<主版本号>.<次版本>.<增量版本>-<里程碑版本>
- 主版本号:不兼容旧特性。
- 次版本号:在旧特性完全兼容的前提下,增加新特性。
- 增量版本号:特性完全不变的前题下,修正BUG。
-
里程碑版本:常用名有
SNAPSHOT
、alpha-1
、alpha-2
、beta-1
、beta-2
在依赖中不推荐使用LATEST
和RELEASE
,Maven 3中禁止使用插件版本为LATEST
或
RELEASE
,因为这样会指向到不固定的版本。
发布版本
从快照版本到发布版本的checklist:
- 全部测试通过
- 没有快照版本依赖
- 没有快照版本插件依赖
- 代码已经提交到了版本控制系统
自动发布版本
maven-release-plugin主要有三个目标:
-
release:prepare:
- 检查是否有未提交的代码
- 检查是否有快照依赖
- 根据用户输入把快照版本升级为发布版本
- 把POM中的SCM信息更新为标签地址
- 基于修改后的POM执行Maven构建
- 提交POM变更
- 基于用户输入给代码打标签
- 把代码从发布版本升级为新的快照版本
- 提交POM变更
-
release:rollback:回退
release:prepare
的工作,但不会删除生成的标签,要手动 删除。 - release:perform:执行版本发布。签出release:prepare生成的标签中的源代码,并 在此基础上执行mvn deploy打包发布到仓库。
项目是配置
配置主干地址:
- connection:只读地址
- developerConnection:可提交地址
- url:浏览器中访问的地址
用参数方式配置:
mvn release:prepare \ -Dproject.scm.developerConnection=scm:svn:file:///D:/subversion_data/repos/my_repo/my-app-example/trunk \ -DtagBase=file:///D:/subversion_data/repos/my_repo/my-app-example/tags
POM文件配置方式:
<project> ... <scm> <connection>scm:svn:http://192.168.1.103/app/trunk</connection> <developerConnection>scm:svn:http://192.168.1.103/app/trunk</developerConnection> <url>http://192.168.1.103/account/trunk</url> </scm> ... </project>
配置标签地址:
<project> ... <build> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.0</version> <configuration> ... <tagBase>https://192.168.1.103/app/tags/</tagBase> ... </configuration> </plugin> ... </plugins> </build> ... </project>
准备发布mvn release:prepare
,然后按提示操作。
执行后如果发现错误可以用mvn release:rollback
回滚,但SCM里的标签要手动操作。
在有多个模块的情况下,可用autoVersionSubmodules
参数让子模块的版本都保持一致:
mvn release:prepare -DautoVersionSubmodules=true
在确认没有问题以后,用mvn release:perform
执行代码签出、部署、提交工作。
在超级POM中已经定义了把源代码和javadoc一起打包布置的工作了。一般在日常快照版本
中用不着。如果在日常也要生成,可以加上参数,比如:
preformRelease
:
mvn clean install -DperformRelease=true
自动创建分支
maven-release-plugin的release:branch电影票包含以下任务:
- 检查是否有未提交的代码
- 自发分支版本
- 更新POM文件中SCM地址为分支地址
- 提交
- 把主干代码复制到分支中
- 自发本地代码回退到分支之前的版本
- 提交本地更改
要配置主干与分支的地址:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.0</version> <configuration> <tagBase>https://192.168.1.103/app/tags</tagBase> <branchBase>https://192.168.1.103/app/branches</branchBase> </configuration> </plugin>
如果按svn标准来的话应该用不着配置tagBase和branchBase。
创建分支,指定分支版本、更新分支版本、但不更新主干版本:
mvn release:branch -DbranchName=1.1.x \ -DupdateBranchVersions=true -DupdateWorkingCopyVersion=false
然后按提示输入新版本号。
GPG插件
maven-gpg-plugin:
<project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <version>1.0</version> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> <goal>sign</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ... </project>
签名构造
通过gpg签名并发布构件:
mvn clean deploy -Dgpg.passphrase=yourpassphrase
因为已经发布的构件POM不可修改,所以对于已经发布的构件签名,要用另外的目标:
mvn gpg:sign-and-deploy-file > -DpomFile=target/myapp-1.0.pom > -Dfile=target/myapp-1.0.jar > -Durl=http://oss.sonatype.org/service/local/staging/deploy/maven2/ > -DrepositoryId=sonatype_oss
发布时自动签名
POM或settings.xml中添加一个Profile:
<profiles> <profile> <id>release-sign-artifacts</id> <activation> <property> <name>performRelease</name> <value>true</value> </property> </activation> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <version>1.0-</version> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> <goal></goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
注意maven-release-plugin有个bug,release:perform
中签名可能会引起进程挂起。
为了避免要配置mavenExecutorId
:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.0-</version> <configuration> <tagBase>https://192.168.1.103/app/tags</tagBase> <branchBase>https://192.168.1.103/app/branches</branchBase> <mavenExecutorId>forked-path</mavenExecutorId> </configuration> </plugin>
这样在执行release:perform
发布时自动签名。