目前项目组在开发一个项目,由多个子模块构成,构建工具是maven,版本控制工具是svn。本文想对如何结合使用maven和svn提出一点初步的想法

一、只有svn的情况

首先考虑没有maven的情况。这样的话,项目组每个开发人员,都需要在本地check out所有的源码。

每次提交之前,需要先更新周边工程的代码。由于工程之间是依赖的,所以很可能需要把所有的代码都更新一遍。在项目依赖混乱的情况下,就更麻烦 ,等于说,项目组成员之间的协作,是以SVN为中心的

这种做法的缺点在于:

1、开发人员本地需要有所有的代码,编译速度很慢

2、如果是别人负责的模块出错,会影响自己的开发。如果项目比较大的话,别人负责的模块的问题,自己实际上是解决不了的

这种做法的优点在于:

1、提交之前做一次全量更新,相当于在本地做了一次全量编译,提交到SVN上基本可以保证不会出现编译错误。我称之为“悲观提交”,类似于数据库里“悲观锁”

2、由于本地有所有代码,所以本地构建比较不容易出错

二、引入maven的情况

maven的主要作用之一,就是对模块化开发的支持 
  
        开发人员A机器上可以只有工程A,开发人员B机器上只有工程B,其中工程B依赖工程A

只要工程A已经deploy到了远程仓库(私服),那么工程B就可以在本地构建,不需要有工程A的代码。也就是说,每个开发人员本地,都只需要check out自己负责的工程

这种做法的优点在于:

1、每个人只有自己负责的代码,本地构建的速度快

2、如果其他的模块构建出错,对自己的模块不容易造成影响

3、职责划分清晰

这种做法的缺点是:

1、高层模块的构建,依赖于低层的模块。由于开发人员B本地只有工程B的代码,如果工程A还没有deploy到远程仓库,则工程B就无法进行本地构建

2、提交到SVN后,有可能造成SVN上的全量编译失败。比如A删除了一个方法,并提交到svn,但是没有deploy。那么B就会基于A模块旧的构件来进行本地构建,成功后也提交了代码。这样的话,在svn上编译就无法通过

要避免发生以上的问题,我觉得在项目组内要遵循2个规定:

1、提交了代码,需要同时将模块deploy进远程仓库。以免造成远程仓库的构件与svn源代码的不一致

2、需要在pom里将构件更新的策略设置为always Xml代码  
            <snapshots>  
                <enabled>true</enabled>  
                <updatePolicy>always</updatePolicy>  
            </snapshots>

以上2个规定,第一个是解决提交不一致的问题,第二个是解决获取不一致的问题。目的都是为了避免构建成功,但是svn上全量编译失败的问题

由于是先提交,再发现是否SVN编译失败,所以我称之为“乐观提交”

三、比较

总的来说,上述两种方式的区别,关键在于:一种是本地有所有的代码;另一种是本地只有自己负责的代码

对于小项目来说,不存在这个问题。但是如果是比较大的项目,我认为后者是更优的,但是会引入一些额外的问题,需要项目组所有人遵循规范来避免

四、引入CI

结合使用svn和maven,如果引入CI的话,可以让这个过程更加容易

开发人员在本地构建成功之后,把代码提交到svn,由CI系统(比如hudson),来完成deploy的动作

或者,使用SCM插件,绑定到deploy阶段。在deploy成功之后,由插件完成提交svn的动作。这样也可以保证提交svn和deploy的一致性

如果提交之后,在svn上全量编译失败,那么CI系统也会第一时间通知相关人员

五、总结

总的来说,我认为有以下几点:

1、建议采用分模块开发的方式,每个开发人员仅check out自己负责的代码

2、将snapshots更新策略设置为always

3、用ci系统或者scm插件,保证check in和deploy的一致性

4、依赖ci系统,来及时发现svn上的编译错误

转载于:https://blog.51cto.com/7533613/1725953

svn和maven结合讨论相关推荐

  1. SVN优化(一) SVN忽略maven项目的target

    SVN优化(一) SVN忽略maven项目的target 一 eclipse刚开始导入的项目: 二  解决办法 方式一: 在项目代码路径,如: F:\xyx\sl  鼠标右键,"Tortoi ...

  2. svn更新maven项目报错_使用svn管理Maven项目的方法步骤

    0. 在svn服务器中新建一个仓库 在SVN服务器的安装目录下进入bin文件夹,双击VisualAVN Server.msc即可弹出VisualAVN Server窗口 先创建一个新的仓库,右键[Re ...

  3. Linux下搭建jenkins+svn+http+maven自动化部署

    Linux下搭建jenkins+svn+http+maven自动化部署 服务器设置: 卸载redhat的yum,安装centos的yum,配置第三方yum 1.删除redhat原有的rpm -qa | ...

  4. linux svn 自动发布,linux svn tomcat maven 自动发布打包

    1:首先确定了LINUX上已安装SVN MAVEN 2: 把SVN项目CHECKOUT到LINUX服务器 svn checkout svn://172.17.210.82:9999/xxx --use ...

  5. SVN和Maven及Jenkins(转)

    目前项目组在开发一个项目,由多个子模块构成,构建工具是maven,版本控制工具是svn.本文想对如何结合使用maven和svn提出一点初步的想法 一.只有svn的情况  首先考虑没有maven的情况. ...

  6. select SCM type and URL 用m2e插件从svn导出maven项目

    1.用m2e插件从svn导出maven项目 2.下一步到这里,会出现一个警告,select SCM type and URL,你选择type发现下拉列表为空或者只有cvs,没有svn选项 3.点击右下 ...

  7. 版本控制工具:SVN和Maven的区别

    构建工具-maven,版本控制工具-svn. 一.只有svn的情况 首先考虑没有maven的情况.这样的话,项目组每个开发人员,都需要在本地check out所有的源码. 每次提交之前,需要先更新周边 ...

  8. SVN基于Maven的Web项目更新,本地过程详细解释

    周围环境 MyEclipse:10.7 Maven:3.1.1 概要 最近在做项目,MyEclipse下载SVN基于上述Maven的Web问题,有时候搞了非常半天,Maven项目还是出现叉号,最后总结 ...

  9. eclipse中的插件安装(svn、maven、jetty等)

    1.安装jdk 安装完成之后配置java环境变量: JAVA_HOME:jdk安装路径: Path:%JAVA_HOME%\bin: Classpath:.:%JAVA_HOME%\lib\dt.ja ...

  10. linux hudson svn,Hudson Maven SVN快速搭建持续集成环境

    Maven 跨平台的项目管理工具 Apache组织中颇为成功的开源项目 服务于Java平台的项目构建,依赖管理和项目信息管理 持续集成 快速 高频率 自动 构建 所有源码 反馈 目前最流行的开源持续集 ...

最新文章

  1. pip install可能遇到的一些问题
  2. 快速识别Hash加密方式hashid
  3. go语言笔记——append是内置的函数!!!new是一个函数!!!调试可以使用闭包,本质上是print调试,尼玛!...
  4. SAP中的记忆功能没有了,怎么办?
  5. java项目导入包报错_转!java web项目 build path 导入jar包,tomcat启动报错 找不到该类...
  6. Scikit-learn数据预处理分类变量编码之字段特征编码
  7. c++ 操作mysql_C++操作mysql方法总结(1)
  8. 跳槽季:跳和不跳之外的第三选择
  9. webpack学习(四) -- css tree shaking
  10. 我的csdn账号开通啦~
  11. 通讯录管理系统 指针 链表 学生管理系统 人员管理系统
  12. 程序员到底要不要读研,过来人给你几点建议!
  13. matlab神经网络工具箱使用教程
  14. 实现手机蓝牙解锁电脑_手机版和电脑版微信多开的实现方法
  15. 弘辽科技:淘宝类目属性的型号是什么?
  16. 中文转拼音 java_Java中文转拼音
  17. surf和sift算法被申请专利后部分opencv版本无法使用后的安装pycharm+opencv使用surf和sift算法教程
  18. D. Genius‘s Gambit(很多情况)
  19. GIS程序设计期中复习
  20. oracle服务 linux启动命令

热门文章

  1. 利用CURL修改页面内容
  2. Git 删除本地分支和远程分支
  3. PHP trim()的使用
  4. 解决办法:Could not determine java version from ‘11.0.8‘.
  5. LanguageTool至少需要哪些jar包?
  6. 文字处理技术:与布局相关的功能
  7. cmake编译时不能指定头文件路径?
  8. “春风又绿江南岸”真正的关键是什么?
  9. 吾很努力了,吾不是关键因素
  10. 程序员毕业后,一年内能到的水平,二十年后依然这个水平