教父的告白
一切都是纸老虎
posts - 82,  comments - 7,  trackbacks - 0
摘要:
  Subversion是越来越被广泛使用的版本管理工具,使用Ant脚本从Subversion获取代码,实现Daily Build。
  1.Subversion概述
  先引用Version Control with Subversion 中开头的话:
  “If C gives you enough rope to hang yourself, think of Subversion as a sort of rope storage facility.” 
   —Brian W. Fitzpatrick
  然后告诉大家CVS是旧爱,Subversion是新欢。列举若干Subversion的特性和优势为证,懒得写了,直接看这里:Subversion的老家
  关于如何使用Subversion以及相关客户端软件,网上慢慢看吧,官方自由图书不错。
  2.蚂蚁出场
  团队最近的项目中即使用Subversion作为版本控制工具。Daily Build过两天就得搭建起来了,上蚂蚁!
  Tigris.org提供了Subclipse,SvnClientAdapter和SvnAnt。(见这里)
  Subclipse是一个Eclipse的插件,实现了IDE与Subversion得集成;
  SvnClientAdapter是Subversion的一套Java API,封装了客户端对Subversion的一些访问操作;
  SvnAnt是用于访问Subversion的Ant任务,其依赖于SvnClientAdapter。
  我要用的就是SvnAnt,用SVN Check Out一份SvnAnt的代码:
   
   
   
   
   svn co http://subclipse.tigris.org/svn/subclipse/trunk/svnant/ svnant
   
   
   
   
  在这个工程里面还包括svnant的Ant Task使用说明文档,也可以在这里直接查看。
  使用其中的build.xml编译SvnAnt后,在新生成的build子目录下会生成svnant.jar。按照官方文档的说法,把这个svnant.jar和SvnAnt工程的lib目录下的svnClientAdapter.jar和svnjavahl.jar拷贝到Ant的目录下即可。然后编写如下的Ant脚本进行测试:
   
   
   
   
   <?xml version="1.0"?>
   <project name="SVN Ant Test" default="checkout" basedir=".">
   <!-- 1 -->
   <property name="remote.url"
   value="svn://16.157.xxx.xxx/trunk/LNPORTAL/src/P3UIPAdapter/" />
   <property name="local.dir" value="local" /> 
   <!-- 2 -->
   <taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask" />
   <target name="prepare"
   description="Prepare the dirs for other tasks">
   <delete dir="${local.dir}" />
   <mkdir dir="${local.dir}" />
   </target>
   <!-- 3-->
   <target name="checkout" depends="prepare">
   <svn javahl="true" username="lihq" password="password" >
   <checkout url="${remote.url}" destPath="${local.dir}" />
   </svn>
   </target>
   </project>
   
   
   
   
  测试结果暂时不重要。
  3.JavaSVN出场
  SvnAnt的执行依赖SvnClientAdapter,而执行访问SVN时又有两种形式:其一是通过SVN 命令行程序的形式进行的(我在想:如果是这样,还不如使用Ant的exec任务呢);其二是通过Javahl来执行的。
  Javahl是一个用于访问Subversion的Java接口(估计是JNI),这需要Windows机上有svnjavahl.dll才行。团队的Daily Build的并不是Windows,于是求助JavaSVN,这是一个纯Java的SVN解决方案。
  请访问这个Guide:Making SvnAnt use JavaSVN
  我的实际步骤如下:
  Step 1:从Ant的lib目录下移除SvnClientAdapter.jar,我没有发现javahl.jar,于是便移除了svnjavahl.jar,其实移不移后者无所谓;
  Step 2:在刚才那个页面下载javasvn.jar和javasvn-javahl.jar,以及JavaSVN的svnClientAdapter-0.9.32.jar。并把这三个jar都拷贝到Ant的lib目录下;
  然后运行上面写的SVN Ant测试脚本,结果如下:
   
   
   
   …
   BUILD FAILED
   java.lang.AbstractMethodError: org.tigris.subversion.svnant.Feedback.logRevision(J)V
   
   Total time: 7 seconds
   
   
   
  虽然SVN的代码都取下来了,但最后Ant会抛出一个如上的错,这会使得Ant脚本无法运行后面的任务。
  4.Thanks Open Source
  看来,大概是JavaSVN用自己的svnClientAdapter-0.9.32.jar改变了SVNAnt本来对调用。SVNAnt(by Tigris.org)原先是调用svnjavahl.jar来运行SVN命令的。替换svnClientAdapter-0.9.32.jar后,SVNAnt(plus JavaSVN)是调用javasvn-javahl.jar和javasvn.jar来运行SVN命令的。上面那个错误大概就是两套svnClientAdapter对某个抽象方法的定义不完全一致造成的,估计是API版本对应的问题。解决如下:
  首先查看svnant.jar的源代码,发现org.tigris.subversion.svnant.Feedback是实现svnClientAdapter.jar中的一个名为ISVNNotifyListener的接口。这个接口中对报错的logRevision方法的定义是:
   
   
   
   
   public abstract void logRevision(long revision, String path)
   
   
   
   
  而查看svnClientAdapter-0.9.32.jar中的ISVNNotifyListener的接口中的定义是:
   
   
   
   
   public abstract void logRevision(long revision)
   
   
   
   
  明显不匹配,于是修改svnant.jar的源代码,修改org.tigris.subversion.svnant.Feedback,象其中添加一个方法如下:
   
   
   
   
   //This method is added by Beegee
   public void logRevision(long revision) {
   }
   
   //This method is the original one by SVNANT
   public void logRevision(long revision, String path) {
   }
   
   
   
   
  然后重新编译SVNAnt,生成svnant.jar,拷贝替换Ant 的lib目录下的同名jar,重新运行以上SVN Ant测试脚本,结果如下:
  

  OK!
  -end-
posted on 2010-04-09 11:20 暗夜教父 阅读(497) 评论(0)  编辑 收藏 引用 所属分类: JAVA

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜