Java程序开发过程中的CVS控制
2009-01-08
作者:王京武,刘东波,李由
1 引言
当前的信息系统开发过程存在着以下两个急需解决的问题。第一,开发过程中代码的持续集成问题。过去的系统集成,开发人员必须跑遍整个开发中心,询问每一个程序员有没有新的代码,然后把这些新代码拷贝过来,再找到合适的插入位置,这样集成方式效率低下,错误率极高。第二,版本控制问题。由团队进行开发的项目,尤其是开源的项目,版本的控制是复杂的。开发人员对于版本定义的不一致,以及先前版本的内容不完整甚至是丢失都是危险的。对于上述问题最简单的解决方案就是:使用一套具有网络功能并且带有让开发者轻松获取源代码的配置管理系统作为所有代码的来源,然后再使用一套版本管理工具,以做到安全正确地记录和使用各个时期各个版本中的文件。
CVS是一套出色的开放源代码的集配置管理与版本控制一体的工具,管理所有的源文件以及软件的版本信息。这里的源文件不仅仅是代码源文件,还包括创建的脚本文件、属性文件、库文件等。
正确地在系统开发过程中,尤其是在企业级开发或开源开发过程中使用CVS控制工具,体现了软件配置管理与版本控制相结合的思想,这也是开发人员和团队所必须具备的技能。
2 CVS的概念
CVS(Concurrent Versions System)是目前业界使用比较广泛,思想比较先进,控制比较简单的配置管理与版本控制一体的工具。CVS是基于Unix体系中成熟的SCCS(Source Code Control System)和RCS(Revision Control System)开发而成的一个开放源码的项目,已经支持在Windows操作系统上的应用。由于开放源码项目的开发者分布很广泛,对于源文件和版本信息的管理难度很大,需要一个结构简单、功能强大、能够跨平台的工具进行控制,所以开放源码项目配置管理与版本控制已经成为目前CVS的一个典型应用。
2.1 CVS的结构
CVS的基本工作思路就是在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序,由仓库管理员统一管理这些源程序。这样就好象只有一个人在修改文件一样避免了冲突。每个用户在使用仓库之前,首先要把仓库里的项目文件下载到本地。用户做的任何修改都是在本地进行的,然后用CVS 命令进行提交,再由 CVS 仓库管理员统一修改。这样就可以做到跟踪文件的变化,控制代码的冲突。基于以上的工作思路CVS采用客户机/服务器的结构,软件的源文件以及各种版本信息存储在作为仓库的中心服务器内,开发者可以随时通过CVS的客户端工具将本地源文件的副本与中心服务器仓库中的源文件保持一致。CVS的结构如图一所示。
图一:CVS结构图
2.2 CVS的重要术语
2.2.1 Module(模块):相互关联的一组文件的集合,一般一个Module会和一个工程相对应。2.2.2 Respository(仓库):存放Module的仓库,可以在开发人员的本地也可以在远程CVS服务器上。
2.2.3 Branch(分枝):Branch是仓库中独立派生的一个分离的开发版本,用于管理源文件的修改。其中HEAD作为一个特殊的Branch代表主干版本。HEAD可以分离出不同的Branch,而每个Branch中的变更又可以很容易地与HEAD进行合并。这种Branch模型通过支持源文件的并发修改,保证了不同开发者的相对独立,但又高度集成。
2.2.4 Merge(合并):在CVS版本控制过程中,Merge作为一个核心的工作,将派生的Branch版本与HEAD的最新版本之间的变更合并到开发人员的工作目录之中。CVS提供的Merge命令使开发人员在使用源文件时不会锁定该文件,即同一个CVS管理的源文件可以被多个开发人员同时进行修改。
图二:Java开发过程中CVS控制的示意图
2.3 CVS的工作流程
CVS的工作流程包括以下三个步骤。
第一,预处理。通过更新操作保证所有本地源文件与最新的Branch中的源文件一致性。
第二,代码开发。在本地进行软件代码的开发,并在本地保存代码的修改。
第三,同步。当做好提交工作的准备后,进行与服务器的同步操作。Incoming和Outgoing是CVS工作时的两种状态模式,在进行Update操作时(从服务器得到其他人的修改),CVS进入Incoming状态;在进行Commit操作时(把本地修改提交给CVS服务器),CVS进入Outgoing状态。在同步阶段中,开发人员首先通过Update操作检查本地修改是否会造成与服务器端源文件的冲突和对完整性的破坏,最后向服务器Commit本地的修改。CVS版本控制的基本流程如图三所示:
3 Java程序开发过程中的CVS控制
Java语言具有语法简单、安全、支持多线程、具有跨平台性以及纯面向对象等特点。为了广泛适应各种类型的应用模式,先后出现了J2SE、J2ME以及J2EE等组件技术。
现在CVS版本控制器对于Java提供了无缝的支持。众多Java开发工具都将CVS功能内嵌到自身中,作为其版本控制的基本依托。主要支持CVS的开发工具有Borland公司的JBuilder和Eclipse组织提供的开源工具Eclipse。其中,JBuilder代表了当前主流的商用Java开发工具,Eclipse则代表了典型的开源Java开发工具。二者在最新的版本中都已经利用自身嵌入的CVS控制器实现了在本地或远程CVS服务器上的软件版本控制,从而将先进的版本控制思想引入到Java世界中。此外,对于其它尚未嵌入CVS的Java开发工具,开发人员还可以下载得到独立的CVS管理器。比较常用的CVS管理器有WinCVS。三种不同的CVS管理器各有特点,下面分别介绍。
3.1 JBuilder中的CVS控制
JBuilder是Borland公司的Java程序开发的主要工具,更是J2EE组件技术开发中的重要商业工具。JBuilder的标准版和企业版中集成了CVS版本控制系统功能,在JBuilder的应用浏览器中使用CVS的接口可以方便地访问到CVS提供的大部分命令,从而直接访问、使用和控制本地或远程的CVS系统。
JBuilder中使用CVS的主要过程如下:第一,创建CVS仓库(Respository)。该仓库可以位于本地或远程服务器;第二,创建CVS 模块(Module)。开发人员在指定的仓库中创建模块,一旦工程以模块的形成存在,那么工程的内容就都在CVS的控制之下了;第三,将JBuilder开发的源文件添加到CVS仓库中;第四,从CVS仓库中检出(check out)模块内容存放到本地工程中;第五,在检出的本地工程中修改或删除源文件;第六,解决与服务器仓库中的代码冲突,最终将本地源文件的更新内容提交到CVS仓库中。
3.2 Eclipse中的CVS
Eclipse是开源组织的Java开发工具,可以方便高效地开发J2SE和J2EE等组件技术下的信息系统或插件。Eclipse本身内置了CVS命令,不需要使用其他客户端软件,可以直接访问、使用和控制CVS的服务器。
作为开源项目主要使用的开发工具, Eclipse与以JBuilder为代表的商业开发工具在CVS使用上模式上有很大差别,即Eclipse没有在本地创建CVS服务进行控制管理的功能。其原因在于使用Eclipse开发的开源项目,项目中的源文件需要高度地集中管理。开发者需要将本地的源文件提交到远程服务器上,由开源组织统一进行控制。而JBuilder作为商用工具考虑到应用开发者面对的信息系统的类型很广泛,对于开发规模较小的应用,源文件的控制不需要放置在CVS的远程服务器上,可以通过在本地创建CVS服务的方式进行独立控制。
3.3 通过WinCVS控制Java程序
WinCVS是Windows操作系统下的一种CVS客户端控制软件,是目前对于CVS控制最为完善与灵活的软件,其使用方法相对比较复杂。WinCVS独立于任何开发工具,因此可以控制多种开发语言的源文件(如:Java、C/C++、Pascal)。例如,对于使用其他Java开发工具(如:Jdesigner、TextPad等等)甚至是写字板开发的Java程序源文件,WinCVS都能够进行控制管理。
使用WinCVS的过程如下:第一,配置客户端与服务器的参数;第二,CVS管理人员将源文件导入到服务器的模块中;第三,CVS管理人员创建标签、分支;第四,开发人员登录远程CVS服务器;第五,开发人员从服务器仓库中检出(checkout)模块到本地工程(如图四所示);第六,开发人员将本地工程修改过的文件提交到服务器的仓库中;第七,开发人员在每次对本地的文件修改前,将服务器端仓库中存放的文件更新到本地工程中,以保证在多人操作同一个文件时不会引起冲突;第八,开发人员将本地工程中的修改结果提交到服务器仓库中;第九,CVS的管理人员合并不同分支(版本)的文件。在整个过程中,管理人员和开发人员可以随时察看查看文件的当前状态和历史信息。
图四:Checkout操作
4 结束语
利用CVS工具结合配置管理和版本控制的先进思想管理Java程序开发全过程,其目的是建立一整套高效安全的Java软件项目开发的控制流程,以到达软件工程中对于软件开发实现过程的要求。
CVS工具的作用是提供快捷的方法和清晰的控制流程给开发人员。开发人员则需要在理解先进的配置管理和版本控制思想的前提下,使用CVS工具结合Java开发工具做到真正的高效管理。总之,在现代的项目开发过程中,CVS已经成为解决代码持续集成与版本控制的有效工具。