很nb的插件。为什么?
一般开发,基于一个snapshot版本开发,开发完以后,发一个对应的release的包,然后再将代码版本更新为下一个snapshot版本。这些工作当然可以纯手工完成,但是可能比较痛苦,这里介绍的release插件就是干这个的。
这里使用了github作为代码仓库,使用本地的一个nexus作为maven的私服。
1. 定义scm。scm是一款抽象了代码本版控制功能的maven官方插件,release插件正式通过该插件来与git或者svn等代码管理仓库交互,这里定义scm就是为了指定代码库的地址。下面是一个git的例子。
scm:git:https://github.com/xxx/xxx
一般有三个属性,对于开发来说,只定义这一个就行。
2. 插件配置;
例子:
org.apache.maven.plugins
maven-release-plugin
2.5.3
true
这里作为例子配置这些就够了。有一个常用的配置:
clean verify
就是release的目标prepare需要执行哪些目标,默认就是上面的clean和verify。如果需要自定义可以特殊配置。
3. 仓库地址
这个就不贴了。
关于插件目标,主要是prepare和perform两个目标。
prepare:概括来说,就是perform之前需要执行的准备操作,主要是代码版本修改和提交。
具体来说呢?主要有以下几个:
1)检测是否有未提交的代码。
2)检测是否有snapshot依赖。
3)修改工程的版本号为release版本(提示输入)。
4)为当前代码打上一个git的tag(提示输入),提交代码至远程仓库。
5)修改pom为下一个snapshot版本(输入提示),提交至远程仓库。
注意,这里一共提交了两次代码,第一次是release版本,第二次是snapshot版本。
perform:发包。具体来说,perform会从远程代码库拉下刚才第一次提交的release版本的代码。然后内部再起一个maven build过程,执行一次deploy,将release包发至nexus仓库。那怎么找到release版本呢?下面会介绍。
下面看一个例子:
执行prepare之前一般需要执行clean,做一些清理工作。
执行之前,确保满足prepare的检查条件。
mvn release:clean release:prepare
看下具体过程:
[INFO] Verifying that there are no local modifications...
[INFO] Checking dependencies and plugins for snapshots ...
What is the release version for "testMaven"? (com.liyao:testMaven) 2.0: :
What is SCM release tag or label for "testMaven"? (com.liyao:testMaven) testMaven-2.0: :
What is the new development version for "testMaven"? (com.liyao:testMaven) 2.1-SNAPSHOT: :
[INFO] Not generating release POMs
[INFO] Executing goals 'clean verify'...
[INFO] Executing: /bin/sh -c cd /Users/miracle/test/mvn/PPranet/testMaven && git tag -F /var/folders/rl/tf7q0v610mx81mmrqzqfps0m0000gn/T/maven-scm-343870307.commit testMaven-2.0
[INFO] Working directory: /Users/miracle/test/mvn/PPranet/testMaven
[INFO] Executing: /bin/sh -c cd /Users/miracle/test/mvn/PPranet/testMaven && git push https://github.com/miracle2138/java.git refs/tags/liyao03
[INFO] Not removing release POMs
[INFO] Executing: /bin/sh -c cd /Users/miracle/test/mvn/PPranet/testMaven && git push https://github.com/miracle2138/java.git refs/heads/master:refs/heads/master
[INFO] Working directory: /Users/miracle/test/mvn/PPranet/testMaven
[INFO] Release preparation complete.
从这些步骤可以看到prepare做了哪些事。
执行完后,生成了一个release.properties文件。内容如下:
#release configuration
#Fri May 24 22:18:48 CST 2019
project.scm.com.liyao\:testMaven.developerConnection=scm\:git\:https\://github.com/xxx/java.git
scm.tagNameFormat=@{project.artifactId}-@{project.version}
scm.tag=testMaven-2.0
project.dev.com.liyao\:testMaven=2.1-SNAPSHOT
pushChanges=true
scm.url=scm\:git\:https\://github.com/miracle2138/java.git
preparationGoals=clean verify
remoteTagging=true
projectVersionPolicyId=default
scm.commentPrefix=[maven-release-plugin]
project.scm.com.liyao\:testMaven.tag=HEAD
project.rel.com.liyao\:testMaven=2.0
exec.snapshotReleasePluginAllowed=false
exec.additionalArguments=-P developemnt
completedPhase=end-release
这个文件是为后面的perform发包准备的,里面指定了perform该如何从远程仓库拉到release的代码。prepare推代码时要求输入一个Git的tag,tag就被记录在这个文件里,perform会读取这个文件里的tag,利用这个tag来拉取release代码。发完包就会删除。
下面执行perform:
mvn release:perform
这里只看一下拉取代码的过程:
[INFO] Executing: /bin/sh -c cd /Users/miracle/test/mvn/PPranet/testMaven/target && git clone --branch testMaven-2.0 https://github.com/miracle2138/java.git /Users/miracle/test/mvn/PPranet/testMaven/target/checkout
[INFO] Working directory: /Users/miracle/test/mvn/PPranet/testMaven/target
[INFO] Executing: /bin/sh -c cd /var/folders/rl/tf7q0v610mx81mmrqzqfps0m0000gn/T/ && git ls-remote https://github.com/miracle2138/java.git
[INFO] Working directory: /var/folders/rl/tf7q0v610mx81mmrqzqfps0m0000gn/T
[INFO] Executing: /bin/sh -c cd /Users/miracle/test/mvn/PPranet/testMaven/target/checkout && git fetch https://github.com/miracle2138/java.git
[INFO] Working directory: /Users/miracle/test/mvn/PPranet/testMaven/target/checkout
[INFO] Executing: /bin/sh -c cd /Users/miracle/test/mvn/PPranet/testMaven/target/checkout && git checkout testMaven-2.0
[INFO] Working directory: /Users/miracle/test/mvn/PPranet/testMaven/target/checkout
[INFO] Executing: /bin/sh -c cd /Users/miracle/test/mvn/PPranet/testMaven/target/checkout && git ls-files
[INFO] Working directory: /Users/miracle/test/mvn/PPranet/testMaven/target/checkout
[INFO] Invoking perform goals in directory /Users/miracle/test/mvn/PPranet/testMaven/target/checkout
确实使用了之前的tag。
后面就是一个完整的maven的deploy的过程。
发包结束。