- 浏览: 211406 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
Wangwei86609:
非常好的规则引擎框架,支持决策树和多线程运行规则https:/ ...
规则引擎 -
hzxlb910:
真详细,收藏哈
maven setting.xml配置说明 -
东方胜:
[b][/b]
脚本语言 Tcl -
345161974:
hyw520110 写道345161974 写道这个Visua ...
Visual Tcl Binary 完整版(完美中文支持) -
hyw520110:
345161974 写道这个Visual Tcl Binary ...
Visual Tcl Binary 完整版(完美中文支持)
原文:http://juvenshun.iteye.com/blog/376422
什么是版本管理
首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用法。版本管理中说得版本是指构件(artifact)的版本,而非源码的版本(如subversion中常见的rXXX,或者git中一次提交都有个sha1的commit号)。
比如我有一个项目,其artifactId为myapp,随着项目的进展,我们会生成这样一些jar:myapp-1.0-SNAPSHOT.jar,myapp-1.0.jar,myapp-1.1-SNAPSHOT.jar,myapp-1.0.1.jar等等。你可能会说,这很简单啊,我在POM中改个version,mvn clean install不就完了?但这只是表面,本文我将讲述,snapshot和release版本的区别,如何自动化版本发布(如果你的项目有几十个module,你就会觉得手工改POM来升级版本是很痛苦的事情),结合自动化发布的过程,这里还会介绍maven-release-plugin。此外,一些scm概念也会被涉及到,比如tag和branch。
前提:版本控制
不管怎样,我们都需要建立一个项目并提交到SCM中,这里我以subversion为例。你得有一个配置好的subversion repository,这里我建立了一个空的svn仓库,其地址为:https://192.168.1.100:8443/svn/myapp/ 现在,该目录下只有三个空的典型的子目录:/trunk/, branches/, tags/。分别用来存放主干,分支,以及标签。
接着将项目导入到svn仓库中,到项目根目录,运行如下命令:
svn import -m 'project initialization' https://192.168.1.100:8443/svn/myapp/trunk
(注意,这么做你会将目录下所有文件导入到svn库中,但是这其中某些目录和文件是不应该被导入的,如/target目录,以及eclipse相关的项目文件)
目前,我们将项目的版本设置为1.0-SNAPSHOT。
为什么用SNAPSHOT?
我先说说如果没有SNAPSHOT会是什么样子。假设你的项目有2个模块,A,B,其中A依赖B。这三个模块分别由甲,乙两个个人负责开发。在开发过程中,因为A是依赖于B的,因此乙每次做一个改动都会影响到甲,于是,乙提交了一些更改后,需要让甲看到。这个时候,怎么做呢?乙对甲说,“你签出我的代码,build一下就OK了”,甲有点不情愿,但还是照做了,签出代码,svn clean install,然后,发现build出错了,有个测试没有pass。甲郁闷了,对乙说,“你的代码根本不能用,我不想build,你build好了给我”,乙看了看确实自己的代码build不过,于是回去解决了,然后打了个jar包,扔给甲,甲对了对groupId,artifactId,放到了自己的.m2/repository/目录下,OK,能用了。
于是乙每次更新都这样做,打包,复制,然后甲粘贴,使用……渐渐的,大家发现这是个很笨的办法,这是纯手工劳动阿,程序员最BS的就是重复劳动。一天,甲对乙说,“你知道nexus么?你把你的jar发布到nexus上就可以了,我要用就自动去下载,这多棒!”乙说“哦?有这好东西,我去看看”于是乙发现了nexus这块新大陆,并成功的发布了B到nexus上。(见,Nexus入门指南,(图文) )。
但是,请注意,我们这里的一切都假设没有SNAPSHOT,因此如果乙不更改版本,甲下载一次如B-1.0.jar之后,maven认为它已经有了正确的B的版本,就不会再重新下载。甲发现了这个问题,对乙说“你的更新我看不到,你更新了么?”乙说“不可能!我看看”,于是检查一下甲下载的C-1.0.jar,发现那是几天前的。乙一拍脑袋,说“这简单,我更新一下我的版本就好了,我发布个B-1.1.jar上去,你更新下依赖版本”,甲照做了,似乎这么做是可行的。
这里有一个问题,一次提交就更新一个版本,这明显不是正确的管理办法,此外,乙得不停的通知甲更新对B的依赖版本,累不累阿?1.0,或者说1.1,2.0,都代表了稳定,这样随随便便的改版本,能稳定么?
所以Maven有SNAPSHOT版本的概念,它与release版本对应,后者是指1.0,1.1,2.0这样稳定的发布版本。
现在乙可以将B的版本设置成1.0-SNAPSHOT,每次更改后,都mvn deploy到nexus中,每次deploy,maven都会将SNAPSHOT改成一个当前时间的timestamp,比如B-1.0-SNAPSHOT.jar到nexus中后,会成为这个样子:B-1.0-20081017-020325-13.jar。Maven在处理A中对于B的SNAPSHOT依赖时,会根据这样的timestamp下载最新的jar,默认Maven每天 更新一次,如果你想让Maven强制更新,可以使用-U参数,如:mvn clean install -U 。
现在事情简化成了这个样子:乙做更改,然后mvn deploy,甲用最简单的maven命令就能得到最新的B。
从1.0-SNAPSHOT到1.0到1.1-SNAPSHOT
SNAPSHOT是快照的意思,项目到一个阶段后,就需要发布一个正式的版本(release版本)。一次正式的发布需要这样一些工作:
- 在trunk中,更新pom版本从1.0-SNAPSHOT到1.0
- 对1.0打一个svn tag
- 针对tag进行mvn deploy,发布正式版本
- 更新trunk从1.0到1.1-SNAPSHOT
你可以手工一步步的做这些事情,无非就是一些svn操作,一些pom编辑,还有一些mvn操作。但是你应该明白,手工做这些事情,一来繁琐,而来容易出错。因此这里我介绍使用maven插件来自动化这一系列动作。
SCM
首先我们需要在POM中加入scm信息,这样Maven才能够替你完成svn操作,这里我的配置如下:
- <scm>
- <connection>scm:svn:http://192.168.1.100:8443/svn/myapp/trunk/</connection>
- <developerConnection>scm:svn:https://192.168.1.100:8443/svn/myapp/trunk/</developerConnection>
- </scm>
<scm> <connection>scm:svn:http://192.168.1.100:8443/svn/myapp/trunk/</connection> <developerConnection>scm:svn:https://192.168.1.100:8443/svn/myapp/trunk/</developerConnection> </scm>
需要注意的是,很多windows使用的tortoiseSVN客户端,而没有svn命令行客户端,这会导致Maven所有svn相关的工作失败,因此,你首先确保svn --version能够运行。
分发仓库
想要让Maven帮我们自动发布,首先我们需要配置好分发仓库。关于这一点,见Maven最佳实践:Maven仓库 ——分发构件至远程仓库。
maven-release-plugin
紧接着,我们需要配置maven-release-plugin,这个插件会帮助我们升级pom版本,提交,打tag,然后再升级版本,再提交,等等。基本配置如下:
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-release-plugin</artifactId>
- <version>2.0-beta-7</version>
- <configuration>
- <tagBase>https://192.168.1.100:8443/svn/myapp/tags/</tagBase>
- </configuration>
- </plugin>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.0-beta-7</version> <configuration> <tagBase>https://192.168.1.100:8443/svn/myapp/tags/</tagBase> </configuration> </plugin>
GAV我就不多解释了,这里我们需要注意的是configuration元素下的tagBase元素,它代表了我们svn中的tag目录,也就是说,maven-release-plugin帮我们打tag的时候,其基础目录是什么。这里,我填写了svn仓库中的标准的tags目录。
提交代码
接着,确保你的所有代码都提交了,如果你有未提交代码,release插件会报错,既然你要发布版本了,就表示代码是稳定的,所以要么要么把代码提交了,要么把本地的更改抛弃了。
开始工作
现在,屏住呼吸,执行:
mvn release:prepare
执行过程中,你会遇到这样的提示:
What is the release version for "Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT"? (org.myorg:myapp) 1.0: :
——“你想将1.0-SNAPSHOT发布为什么版本?默认是1.0。”我要的就是1.0,直接回车。
What is SCM release tag or label for "Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT"? (org.myorg:myapp) myapp-1.0: :
——“发布的tag标签名称是什么?默认为myapp-1.0。”我还是要默认值,直接回车。
What is the new development version for "Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT"? (org.myorg:myapp) 1.1-SNAPSHOT: :
——“主干上新的版本是什么?默认为1.1-SNAPSHOT。”哈,release插件会自动帮我更新版本到1.1-SNAPSHOT,很好,直接回车。
然后屏幕刷阿刷,maven在build我们的项目,并进行了一些svn操作,你可以仔细查看下日志。
那么结果是什么呢?你可以浏览下svn仓库:
- 我们多了一个tag:https://192.168.1.100:8443/svn/myapp/tags/myapp-1.0/,这就是需要发布的版本1.0。
- 再看看trunk中的POM,其版本自动升级成了1.1-SNAPSHOT。
这不正是我们想要的么?等等,好像缺了点什么,对了,1.0还没有发布到仓库中呢。
再一次屏住呼吸,执行:
mvn release:perform
maven-release-plugin会自动帮我们签出刚才打的tag,然后打包,分发到远程Maven仓库中,至此,整个版本的升级,打标签,发布等工作全部完成。我们可以在远程Maven仓库中看到正式发布的1.0版本。
这可是自动化的 ,正式的 版本发布!
Maven的版本规则
前面我们提到了SNAPSHOT和Release版本的区别,现在看一下,为什么要有1.0,1.1,1.1.1这样的版本,这里的规则是什么。
Maven主要是这样定义版本规则的:
<主版本>.<次版本>.<增量版本>
比如说1.2.3,主版本是1,次版本是2,增量版本是3。
主版本一般来说代表了项目的重大的架构变更,比如说Maven 1和Maven 2,在架构上已经两样了,将来的Maven 3和Maven 2也会有很大的变化。次版本一般代表了一些功能的增加或变化,但没有架构的变化,比如说Nexus 1.3较之于Nexus 1.2来说,增加了一系列新的或者改进的功能(仓库镜像支持,改进的仓库管理界面等等),但从大的架构上来说,1.3和1.2没什么区别。至于增量版本,一般是一些小的bug fix,不会有重大的功能变化。
一般来说,在我们发布一次重要的版本之后,随之会开发新的版本,比如说,myapp-1.1发布之后,就着手开发myapp-1.2了。由于myapp-1.2有新的主要功能的添加和变化,在发布测试前,它会变得不稳定,而myapp-1.1是一个比较稳定的版本,现在的问题是,我们在myapp-1.1中发现了一些bug(当然在1.2中也存在),为了能够在段时间内修复bug并仍然发布稳定的版本,我们就会用到分支(branch),我们基于1.1开启一个分支1.1.1,在这个分支中修复bug,并快速发布。这既保证了版本的稳定,也能够使bug得到快速修复,也不同停止1.2的开发。只是,每次修复分支1.1.1中的bug后,需要merge代码到1.2(主干)中。
上面讲的就是我们为什么要用增量版本。
实战分支
目前我们trunk的版本是1.1-SNAPSHOT,其实按照前面解释的版本规则,应该是1.1.0-SNAPSHOT。
现在我们想要发布1.1.0,然后将主干升级为1.2.0-SNAPSHOT,同时开启一个1.1.x的分支,用来修复1.1.0中的bug。
首先,在发布1.1.0之前,我们创建1.1.x分支,运行如下命令:
mvn release:branch -DbranchName=1.1.x -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false
这是maven-release-plugin的branch目标,我们指定branch的名称为1.1.x,表示这里会有版本1.1.1, 1.1.2等等。updateBranchVersions=true的意思是在分支中更新版本,而updateWorkingCopyVersions=false是指不更改当前工作目录(这里是trunk)的版本。
在运行该命令后,我们会遇到这样的提示:
What is the branch version for "Unnamed - org.myorg:myapp:jar:1.1-SNAPSHOT"? (org.myorg:myapp) 1.1-SNAPSHOT: :
——"分支中的版本号是多少?默认为1.1-SNAPSHOT" 这时我们想要的版本是1.1.1-SNAPSHOT,因此输入1.1.1-SNAPSHOT,回车,maven继续执行直至结束。
接着,我们浏览svn仓库,会看到这样的目录:https://192.168.1.100:8443/svn/myapp/branches/1.1.x/,打开其中的POM文件,其版本已经是1.1.1-SNAPSHOT。
分支创建好了,就可以使用release:prepare和release:perform为1.1.0打标签,升级trunk至1.2.0-SNAPSHOT,然后分发1.1.0。
至此,一切OK。
小结
本文讲述了如何使用Maven结合svn进行版本管理。解释了Maven中SNAPSHOT版本的来由,以及Maven管理版本的规则。并结合SCM的tag和branch概念展示了如何使用maven-release-plugin发布版本,以及创建分支。本文涉及的内容比较多,且略显复杂,不过掌握版本管理的技巧对于项目的正规化管理来说十分重要。Maven为我们提供了一些一套比较成熟的机制,值得掌握。
发表评论
-
Maven Artifacts如何部署到仓库
2012-03-28 11:50 937http://www.blogjava.net/lishunl ... -
maven常见问题问答
2011-11-16 13:24 718前言 Maven,发音是[`meivin],"专家 ... -
maven setting.xml配置说明
2011-11-16 12:43 1263setting.xml view plain ... -
Maven实战指南:“打包”的技巧
2011-10-11 10:13 2025http://tech.it168.com/a2011/062 ... -
M2工程 mvn deploy 401 403错误处理
2011-10-10 15:11 1065http://hi.baidu.com/g4_gc/blog ... -
maven部署web工程基础步骤
2011-10-10 12:43 19861.准备工作 下载maven(url:http://a ... -
eclipse maven wtp jar/lib deploy
2011-10-09 09:57 984eclipse工程(with maven & wtp) ... -
配置Maven web项目
2011-09-13 16:00 9091、创建Web应用 mvn archetype:genera ... -
maven报错:mvn deploy
2011-09-09 14:01 1615一.Error deploying artifact: ... -
maven配置篇之pom.xml
2011-09-08 15:24 756说完了settings.xml配置, ... -
简述maven中的profiles
2011-09-08 15:06 921Profiles是maven的一个很关键的术语:profile ... -
maven项目添加jar包.
2011-08-16 09:31 1115很多新手都不知道如何在maven项目里添加jar包. 以前我还 ... -
Hudson+Maven+SVN 快速搭建持续集成环境
2011-05-26 14:09 962原: http://www.blogjava.net ... -
基于maven和hudson打造持续集成环境
2011-05-26 12:58 1044对持续集成的需求 对持续集成的需求主要来自项目过程的痛,在 ... -
maven 配置篇 之 settings.xml
2011-05-24 20:36 832maven2 比起maven1 来说,需要配置的文件少多了,主 ... -
Maven生命周期详解
2011-05-24 17:47 651Maven强大的一个重要的 ... -
激活Maven profile的几种方式
2011-05-24 17:43 816首先简单介绍下 Maven 的 profile 是什么。对于人 ... -
使用Profile和Resources Filter隔离测试环境
2011-05-24 17:42 783Maven能够帮我们很好的 ... -
使用maven-sql-plugin实现持续数据库集成(CDBI)
2011-05-24 17:41 911数据库持续集成(Continuous Database Int ... -
Maven仓库
2011-05-24 16:30 809什么是Maven仓库 在不用Maven的时候,比如说以前我们 ...
相关推荐
何为Maven 构建,依赖管理,项目信息聚合 Maven核心概念 坐标,依赖,仓库,生命周期,插件 Maven最佳实践 创建、打包、发布、版本管理 项目实战 Nexus(Todo…) M2eclipse(Todo…)
最佳实践 smart-doc+形成业界领先的文档生成与管理解决方案,使用smart-doc完成Java源代码分析并提取注解生成API文档无侵入,自动推送文档至Torna企业级接口文档管理平台. 入门 添加插件 <groupId>...
1、dependencies 和 dependencyManagement,plugins 和 pluginManagement 有什么...dependencyManagement 主要是为了统⼀管理插件,确保所有⼦项⽬使⽤的插件版本保持⼀致,类似的还有 plugins 和 pluginManagement。
第11章:用Maven管理项目版本/11.4 版本管理举例/11.4.3 将项目保存到SVN(SVN:版本管理工具) 第11章:用Maven管理项目版本/11.4 版本管理举例/11.4.4 在POM中配置SVN地址 第11章:用Maven管理项目版本/11.4 版本...
此外,课程还将介绍Maven的高级主题,包括多模块项目的构建、构建配置的定制化、以及集成到持续集成/持续部署(CI/CD)流程中的最佳实践。通过本课程的学习,学员将能够熟练运用Maven进行项目开发,掌握Maven在不同...
无法保证可靠性,性能,稳定性或支持-使用风险自负帮助API团队遵循Apigee的API开发最佳实践。 在源代码管理中跟踪Apigee Config(KVM,缓存,目标服务器等) 在CI管道中部署配置更改以及API 在API开发过程中简化并...
• 项目管理: Maven 让事情变得简单 作者简介 胡键,西安交通大学硕士,2000年毕业后一直从事软件开发。2002年开始使用Java,在平时的项目开发中经常采用OpenSource的工具,如Ant、Maven、Hibernate、Struts...
maven是什么 maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内 行”。作为apache组织中的一个颇为成功的开源项目,maven主要服务于基于 java... 提供开发的最佳实践指南; 能无缝的加入新的特性;
HOME2.3.2 ~/.m22.4 设置http代理2.5 安装m2eclipse2.6 安装netbeans maven插件2.7 maven安装最佳实践2.7.1 设置maven_opts环境变量2.7.2 配置用户范围settings?xml2.7.3 不要使用ide内嵌的maven2.8 小结第...
POM最佳实践 9.6.1. 依赖归类 9.6.2. 多模块 vs. 继承 9.6.2.1. 简单项目 9.6.2.2. 多模块企业级项目 9.6.2.3. 原型父项目 10. 构建生命周期 10.1. 简介 10.1.1. 清理生命周期 (clean) 10.1.2. 默认...
•最佳实践:代码结构| @Configuration | @EnableAutoConfiguration | Beans和依赖注入 •运行代码: IDE |打包| Maven | Gradle •包装应用程序: 生产jar •Spring Boot CLI: 使用CLI •核心特性: SpringApplication ...
Apache Maven 是一个软件项目管理和依赖管理工具。基于项目对象模型(POM:Project Object Model)的概念,Maven 可以从一个中心信息块管理项目的构建、报告和文档。 无论是小型的开源类库项目,还是大型的企业级...
基于Spring Boot的医药管理系统是一个针对药店或...总之,该医药管理系统通过整合现代Java开发的最佳实践,提供了一个健壮、可扩展且易于维护的解决方案,适用于毕业设计项目,能够展示学生在软件开发方面的综合能力。
通过下载和使用这些项目,您将能够深入了解SSM框架的核心概念、设计模式和最佳实践。 二、项目特点 实战性强:这些项目均来自实际业务场景多个领域,具有很强的实战性和参考价值。 技术先进:所有项目均采用最新的...
通过下载和使用这些项目,您将能够深入了解SSM框架的核心概念、设计模式和最佳实践。 二、项目特点 实战性强:这些项目均来自实际业务场景多个领域,具有很强的实战性和参考价值。 技术先进:所有项目均采用最新的...
docker-maven-plugin:直接生成Dockerfile(本地需更换成阿里云层叠,速度和成功率会提升很多) H2:内存式数据库,减少数据库依赖(正式环境时,可以直接切换至MYSQL) spring cloud eureka:用于服务注册发现 ...
提供最佳实践开发指南 允许透明迁移到新功能 简化构建过程 虽然使用 Maven 并不能消除了解底层机制的需要,但 Maven 确实提供了很多细节方面的屏蔽。 提供统一的构建系统 Maven 允许使用其项目对象模型 (POM) 和
是您深入学习SpringBoot开发的最佳实践! 相关技术栈 前端: Thymeleaf,Bootstrap,Ajax,JQuery 开发环境: IDEA,SpringBoot 2.1,Maven 数据库与缓存:MySQL 5.7,Redis,Guava Cache 三方服务:腾讯云短信服务...