目前项目组在开发一个项目,由多个子模块构成,构建工具是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 是一个项目管理和构建自动化工具,主要服务于基于 Java 的项目。它由 Apache 软件基金会提供支持,用于管理项目构建、依赖和文档等过程。Maven 的设计灵感来源于早期的软件构建工具如 Ant,但它引入了一些新的...
Maven 是一个项目管理和构建自动化工具,主要服务于基于 Java 的项目。它由 Apache 软件基金会提供支持,用于管理项目构建、依赖和文档等过程。Maven 的设计灵感来源于早期的软件构建工具如 Ant,但它引入了一些新的...
Maven 是一个项目管理和构建自动化工具,主要服务于基于 Java 的项目。它由 Apache 软件基金会提供支持,用于管理项目构建、依赖和文档等过程。Maven 的设计灵感来源于早期的软件构建工具如 Ant,但它引入了一些新的...
Maven作为Java项目管理和构建工具,同样支持与SVN集成,以便于项目的版本控制和协同开发。本文将详细介绍如何配置Maven以使用SVN,并提供相关的配置文件示例。 一、Maven配置SVN基础 1. 添加 SVN 插件:在 Maven ...
Maven是一个项目管理和构建自动化工具,主要服务于基于Java的项目管理和构建。它由Apache软件基金会提供支持,被广泛应用于Java项目中,用于项目的依赖管理、构建过程管理和文档管理。 ### Maven的主要特点包括: ...
在<plugins></plugins>中添加 <groupId>org.apache.maven.plugins <artifactId>maven-compiler-plugin <version>3.8.1 <source>1.8 <target>1.8 </plugin>
Maven是一个项目管理和构建自动化工具,主要服务于基于Java的软件项目。它使用一个名为`pom.xml`的文件来描述项目的构建过程、依赖关系和其他配置信息。Maven的全称是"Model of Automation",即自动化模型。 ### ...
Maven是一个项目管理和构建自动化工具,主要服务于基于Java的软件项目。它是由Apache软件基金会提供的一个开源工具,使用一种名为Project Object Model (POM) 的XML文件来描述项目的构建过程、依赖关系和其他配置...
maven-svn-revision-number-plugin-1.7.jar 资源共享,有需要其他jar包的可以在评论留言,看到后我会陆续上传。
Maven是一个项目管理和构建自动化工具,主要服务于基于Java的软件项目。它是由Apache软件基金会提供的一个开源工具,使用一种名为Project Object Model (POM) 的XML文件来描述项目的构建过程、依赖关系和其他配置...
Maven是一个项目管理和构建自动化工具,主要服务于基于Java的软件项目。它是由Apache软件基金会提供的一个开源工具,使用一种名为Project Object Model (POM) 的XML文件来描述项目的构建过程、依赖关系和其他配置...
在IT行业中,Maven和SVN是两个非常重要的工具,它们在软件开发流程中起着至关重要的作用。Maven是一个项目管理和综合工具,主要用于Java项目的构建、依赖管理和项目信息管理。而SVN(Subversion)则是一种版本控制...
5. **与其他插件配合**:Maven SVN Revision Number Plugin可以和其他Maven插件(如Resource Plugin)配合使用,确保在打包或构建工件之前,所有包含修订号的地方都已更新。 需要注意的是,虽然提供的压缩包文件名...
本文将深入探讨如何结合Maven和SVN实现项目的自动打包流程,帮助开发者更有效地管理和部署代码。 【Maven】:Maven是一个强大的Java项目管理工具,它能够帮助开发者构建、管理和部署项目。Maven通过使用一个统一的...
- **作用**: Maven 是一个项目管理和理解工具,帮助开发者更有效地构建和管理 Java 项目。 - **安装**: 解压 Maven 的安装包至指定目录,并设置环境变量。 - **环境变量设置**: - `M2_HOME`: Maven 的安装目录。...
在Java开发中,IntelliJ IDEA是一款备受推崇的集成开发环境(IDE),Maven是一个强大的项目管理和构建工具,而SVN则是常用的版本控制系统。本指南将详细介绍如何在Windows环境下搭建IntelliJ IDEA、Maven和SVN的开发...
Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project
通过以上步骤,可以成功地使用 Jenkins、Maven、SVN 和 SpringBoot 实现一键式打包发布流程。这种方式极大地提高了软件开发过程中的自动化程度,减少了人工干预的机会,从而降低了错误率并提升了效率。在实际应用中...
**标题解析:** "手把手图解,详解...总结来说,本文将通过图文并茂的方式,详细讲解如何整合Jenkins、svn和Maven进行持续集成,并利用SHELL脚本提升自动化程度,为软件开发团队提供一套高效稳定的持续集成方案。