Jade Dungeon

Maven对项目版本的管理

Maven对项目版本的管理

版本号

版本号格式

<主版本号>.<次版本>.<增量版本>-<里程碑版本>
  • 主版本号:不兼容旧特性。
  • 次版本号:在旧特性完全兼容的前提下,增加新特性。
  • 增量版本号:特性完全不变的前题下,修正BUG。
  • 里程碑版本:常用名有SNAPSHOTalpha-1alpha-2beta-1beta-2

在依赖中不推荐使用LATESTRELEASE,Maven 3中禁止使用插件版本为LATESTRELEASE,因为这样会指向到不固定的版本。

发布版本

从快照版本到发布版本的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发布时自动签名。