用户工具

站点工具


分享:技术:maven:maven_scm_release_plugin

maven-scm-plugin插件和maven-release-plugin插件的介绍

背景

项目SNAPSHOT快照版本开发到一个阶段后,需要发布一个release稳定版本。一次正式的发布需要这样一些工作:

  1. 在trunk中,更新pom版本从0.0.1-SNAPSHOT到0.0.1
  2. 对0.0.1打一个svn tag
  3. 针对tag进行mvn deploy,发布稳定版本
  4. 更新trunk从0.0.1到0.0.2-SNAPSHOT

当然0.0.1后面紧跟的不一定是0.0.2,规范的maven版本应该是:<主版本>.<次版本>.<增量版本>

  • 主版本一般来说代表了项目的重大的架构变更
  • 次版本一般代表了一些功能的增加或变化,但没有架构的变化
  • 增量版本,一般是一些小的bug fix,不会有重大的功能变化

所以0.0.1后面可能是0.1.1也可能是1.0.1,不一定是0.0.2

接着上面继续讲,每次正式的发布你都可以手工一步步的做这些事情,无非就是一些svn操作,一些pom编辑,还有一些mvn操作。但是重复手工做这些事情,一来繁琐,而来容易出错。因此maven-scm-plugin插件和maven-release-plugin插件就是用来自动化这一系列动作。

操作

pom.xml源码

注意其中的:

  • scm软件配置管理
  • nexus私服仓库
  • scm软件配置管理插件
  • 版本发布插件
  • 版本发布管理
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.gxx</groupId>
	<artifactId>record</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>record Maven Webapp</name>
	<url>http://maven.apache.org</url>
 
	<!-- 项目属性 -->
	<properties>
		<!-- jar 版本设置 -->
		<spring.version>4.0.5.RELEASE</spring.version>
		<aspectjrt.version>1.6.9</aspectjrt.version>
		<aspectjweaver.version>1.6.1</aspectjweaver.version>
		<freemarker.version>2.3.20</freemarker.version>
		<mybatis.version>3.2.7</mybatis.version>
		<mybatis-spring.version>1.2.2</mybatis-spring.version>
		<mybatis-generator-core.version>1.3.2</mybatis-generator-core.version>
		<servlet-api.version>2.4</servlet-api.version>
		<jsp-api.version>2.0</jsp-api.version>
		<jstl.version>1.2</jstl.version>
		<standard.version>1.1.2</standard.version>
		<jackson-databind.version>2.4.0</jackson-databind.version>
		<jackson-annotations.version>2.4.0</jackson-annotations.version>
		<jackson-module-jaxb-annotations.version>2.4.0</jackson-module-jaxb-annotations.version>
		<jackson-core.version>2.4.0</jackson-core.version>
		<junit.version>4.11</junit.version>
		<log4j.version>1.2.16</log4j.version>
		<mysql-connector-java.version>5.1.9</mysql-connector-java.version>
		<commons-dbcp.version>1.4</commons-dbcp.version>
	</properties>
 
	<!-- scm软件配置管理 -->
	<scm>
		<connection>scm:svn:svn://121.43.104.34/gxx/trunk/record</connection>
		<developerConnection>scm:svn:svn://121.43.104.34/gxx/trunk/record</developerConnection>
	</scm>
 
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
		<!-- aspectj -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${aspectjrt.version}</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>${aspectjweaver.version}</version>
		</dependency>
 
		<!-- freemarker -->
		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>${freemarker.version}</version>
		</dependency>
 
		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>${mybatis-spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis.generator</groupId>
			<artifactId>mybatis-generator-core</artifactId>
			<version>${mybatis-generator-core.version}</version>
		</dependency>
 
		<!-- j2ee基础 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>${servlet-api.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>${jsp-api.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
		</dependency>
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>${standard.version}</version>
		</dependency>
 
		<!-- jackson -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson-databind.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>${jackson-annotations.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.module</groupId>
			<artifactId>jackson-module-jaxb-annotations</artifactId>
			<version>${jackson-module-jaxb-annotations.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>${jackson-core.version}</version>
		</dependency>
 
		<!-- log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>
 
		<!-- junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
			<version>${junit.version}</version>
		</dependency>
 
		<!-- mysql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql-connector-java.version}</version>
		</dependency>
 
		<!-- dbcp -->
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>${commons-dbcp.version}</version>
		</dependency>
	</dependencies>
 
	<!-- 设定除中央仓repo1.maven.org/maven2/)外的其他仓库,按设定顺序进行查 -->
	<repositories>
		<!-- nexus私服仓库 -->
		<repository>
			<id>nexus</id>
			<name>Team Nexus Repository</name>
			<url>http://121.43.104.34:8081/nexus/content/groups/public</url>
		</repository>
		<repository>
			<id>offical</id>
			<name>Maven Official Repository</name>
			<url>http://repo1.maven.org/maven2</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>spring-milestone</id>
			<name>Spring Maven MILESTONE Repository</name>
			<url>http://maven.springframework.org/milestone</url>
		</repository>
		<repository>
			<id>jboss</id>
			<name>Jboss Repository</name>
			<url>http://repository.jboss.org/nexus/content/groups/public-jboss/</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>java.net</id>
			<name>Java.net Repository</name>
			<url>http://download.java.net/maven/2/</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>spring-release</id>
			<name>Spring Maven Release Repository</name>
			<url>http://repo.springsource.org/libs-release</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
 
	<build>
		<finalName>record</finalName>
		<plugins>
			<!-- jdk编译插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.0.2</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
					<encoding>utf8</encoding>
				</configuration>
			</plugin>
			<!-- scm软件配置管理插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-scm-plugin</artifactId>
				<version>1.3</version>
			</plugin>
			<!-- 版本发布插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-release-plugin</artifactId>
				<version>2.4</version>
				<configuration>
					<tagBase>svn://121.43.104.34/gxx/tags/record</tagBase>
					<branchBase>svn://121.43.104.34/gxx/branches/record</branchBase>
				</configuration>
			</plugin>
			<!-- 原型插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-archetype-plugin</artifactId>
				<version>2.2</version>
			</plugin>
		</plugins>
	</build>
 
	<!-- 版本发布管理 -->
	<distributionManagement>
		<!-- release稳定版本 -->
		<repository>
			<id>nexus-releases</id>
			<name>Nexus Release Repository</name>
			<url>http://121.43.104.34:8081/nexus/content/repositories/releases/</url>
		</repository>
		<!-- snapshots快照版本 -->
		<snapshotRepository>
			<id>nexus-snapshots</id>
			<name>Nexus Snapshot Repository</name>
			<url>http://121.43.104.34:8081/nexus/content/repositories/snapshots/</url>
		</snapshotRepository>
	</distributionManagement>
</project>

操作步骤

D:\05.HeadWorkspace\record>mvn release:prepare #进入项目目录,dir会看到pom.xml,当前版本是0.0.1-SNAPSHOT,执行脚本
###############################################################################
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building record Maven Webapp 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-release-plugin:2.4:prepare (default-cli) @ record ---
[INFO] Resuming release from phase 'scm-check-modifications'
[INFO] Verifying that there are no local modifications...
[INFO]   ignoring changes on: **\release.properties, **\pom.xml.next, **\pom.xml
.releaseBackup, **\pom.xml.backup, **\pom.xml.branch, **\pom.xml.tag
[INFO] Executing: cmd.exe /X /C "svn --non-interactive status"
[INFO] Working directory: D:\05.HeadWorkspace\record
[INFO] Checking dependencies and plugins for snapshots ...
What is the release version for "record Maven Webapp"? (com.gxx:record) 0.0.1: :
###############################################################################
->输入回车,以0.0.1为发布版本,也可以输入新的版本
###############################################################################
What is SCM release tag or label for "record Maven Webapp"? (com.gxx:record) rec
ord-0.0.1: :
###############################################################################
->输入回车,以record-0.0.1为tag标签名称,也可以输入新的标签
###############################################################################
What is the new development version for "record Maven Webapp"? (com.gxx:record)
0.0.2-SNAPSHOT: :
###############################################################################
->输入回车,以0.0.2-SNAPSHOT为新的开发版本,也可以输入新的版本
###############################################################################
...
[INFO] Release preparation complete.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 32.574s
[INFO] Finished at: Mon Jul 06 16:03:00 CST 2015
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------------------
###############################################################################
#这个时候在svn://121.43.104.34/gxx/tags/record下可以看到名字为record-0.0.1的tag
#pom.xml从0.0.1-SNAPSHOT变成0.0.2-SNAPSHOT,并提交svn
#record文件夹下会出现俩文件:pom.xml.releaseBackup和release.properties
D:\05.HeadWorkspace\record>mvn release:perform #再执行脚本
#maven-release-plugin会自动帮我们检出刚才打的tag,然后打包,分发到nexus私有仓库中

结束检查

查看pom.xml 查看svn 查看nexus

错误记录

在这个过程中我报过一些错误,这里都记录了下来,如果有相同的错误信息出现,可以参考后面跟的解决方案

报错:
[ERROR] Command output:
[ERROR] 'svn' 不是内部或外部命令,也不是可运行的程序
[ERROR] 或批处理文件。

解决方法:
windows安装svn的时候默认是不安装 svn command line这个东西的,重新打开svn的安装exe,选择modify,将“command line client tools”允许安装,然后next继续安装(注意版本一致性)。
http://blog.csdn.net/mitea90/article/details/19075673
报错:
[ERROR] Command output:
[ERROR] svn: E155007: 'D:\05.HeadWorkspace\record\pom.xml' is not a working copy

解决方法:
项目必须是从svn仓库co出来的
报错:
[ERROR] svn: E155036: Please see the 'svn upgrade' command
[ERROR] svn: E155036: The working copy at 'D:\05.HeadWorkspace\record'
[ERROR] is too old (format 29) to work with client version '1.8.10 (r1615264)' (
expects format 31). You need to upgrade the working copy first.

解决方法:
对本地文件夹进行一次upgrade操作,在项目文件夹上右键,svn upgrade
报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.4
:prepare (default-cli) on project record: Cannot prepare the release because you
 have local modifications :
[ERROR] [pom.xml:modified]
[ERROR] [src\main\java\com\gxx\record\web\user\UserController.java:modified]
[ERROR] [src\main\webapp\WEB-INF\ftl\user\preRegist.ftl:deleted]
[ERROR] [src\main\webapp\WEB-INF\ftl\user\preRegistFtl.ftl:added]

解决方法:
由于要发布release版本,前提一定要代码先提交完,所以要先提交代码
报错:
[ERROR] The svn tag command failed.
[ERROR] Command output:
[ERROR] svn: E160013: File not found: transaction '6-6', path '/tags/record/reco
rd-0.0.1'

解决方法:
trunk,tags,branches需要import导入初始化资源,客户端才能读取和提交内容到该目录下
分享/技术/maven/maven_scm_release_plugin.txt · 最后更改: 2015/07/07 15:51 由 gxx