目前项目组在开发一个项目,由多个子模块构成,构建工具是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
- <snapshots>
- <enabled>true</enabled>
- <updatePolicy>always</updatePolicy>
- </snapshots>
<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上的编译错误
以上就是我的一点初步想法,大家有没有什么更好的意见?
相关推荐
Maven更新问题 今天Maven在更新的时候发现一直更新不成功,总结下解决方法。 在apache-maven-3.5.2/conf/setting.xml中加入以下配置即可解决 alimaven aliyun maven ...
maven-svn-revision-number-plugin-1.7.jar 资源共享,有需要其他jar包的可以在评论留言,看到后我会陆续上传。
Maven配置SVN的方法和SVN包全套,测试后整理的
Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project
java系列:maven
在<plugins></plugins>中添加 <groupId>org.apache.maven.plugins <artifactId>maven-compiler-plugin <version>3.8.1 <source>1.8 <target>1.8 </plugin>
由于目前intellij这个开发工具的使用率不是很高、加上maven的开发也不是特别普及,intellij+maven+svn的环境配置有很多人都不知道如何配置,本人也是各种搜集资料才搞好这么一个环境的搭建,觉得特别辛苦,就整理了...
jenkins+maven+svn+tomcat 持续集成环境快捷部署,实现自动编译打包部署
maven-svn-revision-number-plugin-1.4.jar
maven-svn-revision-number-plugin-1.2.jar
idea创建Maven项目时,报错显示Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.0.2:resources,并且Maven插件内看不到 mybatis-generator。如下图: 折腾了好久发现配置放错地方了,...
maven-svn-revision-number-plugin-1.7-sources.jar
工作目的:实现自动化部署工作,以期提高开发项目的工作效率; 工作内容:利用开源的可持续集成工具,实现java项目的...二、 Maven对web项目的编译、打包与发布; 三、 Hudson对web项目实现自动化的编译、打包与发布;
Maven 是一种流行且功能强大的项目管理工具,主要用于构建、发布和管理 Java 项目。本文将介绍 Maven 的基本概念、核心功能和优势,以及它在项目开发中的重要作用。 第一部分:Maven 的基本概念 解释 Maven 的基本...
Hudson+Maven+SVN搭建持续集成环境
第四课:Maven私服构建与插件开发1
- [一、Maven简介和快速入门](#一Maven简介和快速入门) - [1.1 Maven介绍](#11-Maven介绍) - [1.2 Maven主要作用理解](#12-Maven主要作用理解) - [1.3 Maven安装和配置](#13-Maven安装和配置) - [二、基于IDEA的...
java视频教程之SVN Maven搭建自动化构建教程 Eclipse中使用Maven视频教程云盘下载链接
Maven可以简化项目的构建和依赖管理,并提供了一种规范化和可复用的方式来管理Java项目。它广泛应用于Java开发领域,简单来说:它提供了一个简单而强大的方式来管理项目的构建、依赖关系和文档在企业级项目中被广泛...
毕设项目:基于maven+SSM框架实现的云端汽修后台管理系统 毕设项目:基于maven+SSM框架实现的云端汽修后台管理系统 毕设项目:基于maven+SSM框架实现的云端汽修后台管理系统 毕设项目:基于maven+SSM框架实现的云端...