java集成svnkit
http://beisicao.iteye.com/blog/1112843
一、SVN快速入门
本文主要介绍在windows下使用的方式,对于UNIX环境下,区别并不大。
介绍的具体步骤如下:
软件下载
服务器和客户端安装
建立版本库(Repository)
配置用户和权限
运行独立服务器
初始化导入
基本客户端操作
1、软件下载
下载Subversion服务器程序
到官方网站的下载二进制安装文件,来到二进制包下载部分,找到WindowsNT,2000,XPand2003部分,然后选择"thisdirectory",这样我们可以看到许多下载的内容,目前可以下载svn-1.4.0-setup.exe。
下载Subversion的Windows客户端TortoiseSVN
TortoiseSVN是扩展WindowsShell的一套工具,可以看作Windows资源管理器的插件,安装之后Windows就可以识别Subversion的工作目录。
官方网站是TortoiseSVN,下载方式和前面的svn服务器类似,在Download页面的我们可以选择下载的版本,目前的最高稳定版本的安装文件为TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi。
另外,subversion有相应的eclipse插件,通过此插件可以在eclipse集成开发环境中对开发项目进行版本管理。在这里暂不做介绍。
2、服务器和客户端安装
服务器安装,直接运行svn-1.4.0-setup.exe,根据提示安装即可,这样我们就有了一套服务器可以运行的环境。
安装TortoiseSVN,同样直接运行TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi按照提示安装即可,不过最后完成后会提示是否重启,其实重启只是使svn工作拷贝在windows中的特殊样式生效,与所有的实际功能无关,这里为了立刻看到好的效果,还是重新启动机器。
3、建立版本库(Repository)
运行Subversion服务器需要首先要建立一个版本库(Repository),可以看作服务器上存放数据的数据库,在安装了Subversion服务器之后,可以直接运行,如:
svnadmincreateE:\svndemo\repository
就会在目录E:\svndemo\repository下创建一个版本库。
我们也可以使用TortoiseSVN图形化的完成这一步:
在目录E:\svndemo\repository下"右键->TortoiseSVN->CreateRepositoryhere...“,然后可以选择版本库模式,这里使用默认即可,然后就创建了一系列目录和文件。
4、配置用户和权限
来到E:\svndemo\repository\conf目录,修改svnserve.conf:
#[general]
#password-db=passwd
改为:
[general]
password-db=passwd
然后修改同目录的passwd文件,去掉下面三行的注释:
#[users]
#harry=harryssecret
#sally=sallyssecret
最后变成:
[users]
harry=harryssecret
sally=sallyssecret
5、运行独立服务器
在任意目录下运行:
svnserve-d-rE:\svndemo\repository我们的服务器程序就已经启动了。注意不要关闭命令行窗口,关闭窗口也会把svnserve停止。
也可以把其设置为windows服务。
6、初始化导入
来到我们想要导入的项目根目录,在这个例子里是E:\svndemo\initproject,目录下有一个readme.txt文件:
右键->TortoiseSVN->Import...
URLofrepository输入“svn://localhost/”
ok
完成之后目录没有任何变化,如果没有报错,数据就已经全部导入到了我们刚才定义的版本库中。
需要注意的是,这一步操作可以完全在另一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22/”。
7、基本客户端操作
取出版本库到一个工作拷贝:
来到任意空目录下,在本例中是E:\svndemo\wc1,运行右键->Checkout,在URLofrepository中输入svn://localhost/,这样我们就得到了一份工作拷贝。
在工作拷贝中作出修改并提交:
打开readme.txt,作出修改,然后右键->Commit...,这样我们就把修改提交到了版本库,我们可以运行。
察看所作的修改:
readme.txt上右键->TortoiseSVN->ShowLog,这样我们就可以看到我们对这个文件所有的提交。在版本1上右键->Comparewithworkingcopy,我们可以比较工作拷贝的文件和版本1的区别。
二、SVNKit开发环境
1、开发环境准备
SVN服务器版本我们选择比较稳定的版本Subversion1.4,安装在windows操作系统上。
SVNKit我们选择1.3.0版本,此版本支持Subversion1.6以下的所有版本。
2、开发环境配置
在开发环境中创建好项目后,在类路径中加上SVNKit的jar包即可开始对subversion进行相关的操作。Jar包有trilead.jar,svnkit-javahl.jar,svnkit-cli.jar,svnkit.jar和jna.jar。
三、SVNKit的结构
SVNKit是一个纯java的subversion客户端库,使用SVNKit无需安装任何subversion客户端,支持各种操作系统。
四、SVNKit类关系图
SVNKit的API主要分为两类:HighLevelAPI和LowLevelAPI。
通常情况下,我们使用HighLevelAPI即可完成工作任务。HighLevelAPI通过封装、使用LowLevelAPI,使开发工作变得相对简单、容易。在此我们重点介绍HighLevelAPI。
HighLevelAPI介绍:
在HighLevelAPI中,我们通过SVNClientManager类即可访问很多接口,这些接口几乎允许subversion用户执行可能需要的任何工作。这些工作包括:checkingout、更新、提交、获取历史版本、比较版本间的差异、浏览存储库等等。类图如下图所示:
通过类图我们可以看到,通过SVNClientManager类可以获得各种client操作类的引用,进而可以执行很多操作。
接下来,对client操作类进行分别介绍:
SVNLogClient:
通过此类可以获得版本修订历史记录、浏览存储库条目、文件内容注释。
doLog(…)用来获取版本的修订历史
doList(…)用来获取存储库条目树
doAnnotate(…)用来获取文件内容注释
SVNLogClient的方法和SVN命令行客户端的命令的对应关系。
SVNKitSubversion
doLog()'svnlog'
doList()'svnlist'
doAnnotate()'svnblame'
SVNUpdateClient:
通过此类可以checkout、更新、切换工作副本,也可以从存储库中导出目录或文件。
doCheckOut(…)从存储库中检出工作副本。
doUpdate(…)把工作副本更新为最新版本或某个指定版本。
doSwitch(…)把工作副本更新为同一个存储库的不同分支上的版本。
doExport(..)从存储库中导出目录或文件。
doRelocate()把工作副本更新为不同的存储库中的版本。
SVNUpdateClient的方法和SVN命令行客户端的命令的对应关系。
SVNKitSubversion
doCheckout()'svncheckout'
doUpdate()'svnupdate'
doSwitch()'svnswitch'
doRelocate()'svnswitch--relocateoldURLnewURL'
doExport()'svnexport'
SVNWCClient:
此类提供了许多和本地工作副本相关的操作,同时也能访问存储库。
doAdd(…)添加文件、目录到工作副本并且预定添加到存储库。它们会在下次提交上传并添加到存储库中。
doDelete(…)从工作副本中删除一个文件或目录。它们会在下次提交上传并添加到存储库中。
doCleanup(…)递归清理工作副本,删除未完成的工作副本锁定,并恢复未完成的操作。
doInfo(…)获取一个工作副本条目的信息。
doLock(…)锁定工作副本或存储库中的条目,使其他用户不能对条目进行修改。
doUnlock(…)解锁工作副本或存储库中的条目。
doSetProperty(…)对工作副本或存储库中的条目设置属性名和属性值。
doSetrevisionProperty(…)对修订版本的条目设置属性名和属性值。
doGetProperty(…)获得工作副本或存储库中条目的属性值。
doGetRevisionProperty(…)获得修订版本中的条目的属性值。
doRevert(…)取消所有本地编辑。
SVNWCClient的方法和SVN命令行客户端的命令的对应关系。
SVNKitSubversion
doAdd()'svnadd'
doDelete()'svndelete'
doCleanup()'svncleanup'
doInfo()'svninfo'
doLock()'svnlock'
doUnlock()'svnunlock'
doSetProperty()'svnpropsetPROPNAMEPROPVALPATH'
'svnpropdelPROPNAMEPATH'
'svnpropeditPROPNAMEPATH'
doSetRevisionProperty()'svnpropsetPROPNAME--revprop–rREVPROPVAL[URL]'
'svnpropdelPROPNAME--revprop-rREV[URL]'
'svnpropeditPROPNAME--revprop-rREV[URL]'
doGetProperty()'svnpropgetPROPNAMEPATH'
'svnproplistPATH'
doGetRevisionProperty()'svnpropgetPROPNAME--revprop–rREV[URL]'
'svnproplist--revprop-rREV[URL]'
doResolve()'svnresolved'
doRevert()'svnrevert'
SVNStatusClient:
此类用来获取工作副本条目(文件或目录)的状态信息。
doStatus(…)获得一个工作副本条目的状态。
SVNStatusClient的方法和SVN命令行客户端的命令的对应关系。
SVNKitSubversion
doStatus()'svnstatus'
SVNCommitClient:
此类提供了把改变提交到存储库上的一些操作。
doCommit(…)将修改从工作副本提交到存储库。
doImport(…)递归提交一个路径(本地目录)到存储库。
doDelete(…)从存储库中删除一个条目。
doMkDir(…)在存储库中创建一个目录。
SVNCommitClient的方法和SVN命令行客户端的命令的对应关系。
SVNKitSubversion
doCommit()'svncommit'
doImport()'svnimport'
doDelete()'svndeleteURL'
doMkDir()'svnmkdirURL'
SVNMoveClient:
此类提供文件在工作副本内移动、取消移动等操作。
doMove(…)把源条目移动到目的条目。
undoMove(…)取消上次的移动操作。
doVirtualCopy(…)复制或移动源文件的版本控制信息到目的文件。
SVNCopyClient:
此类可提供SVN支持的任何复制和移动操作。
doCopy(…)
SVNDiffClient:
此类提供比较不同版本间的差异和合并差异的方法。
doDiff(…)获取两个版本间的差异。
doMerge(…)合并两组文件间的差异。
SVNDiffClient的方法和SVN命令行客户端的命令的对应关系。
SVNKitSubversion
doDiff()'svndiff'
doMerge()'svnmerge'
五、程序框架
首先新建java项目,把SVNKit的jar包放到项目的类路径下面。
Jar包有trilead.jar,svnkit-javahl.jar,svnkit-cli.jar,svnkit.jar和jna.jar。
程序框架如下所示:
/*第一步: *导入可能用到的类 */ import java.io.*; import org.tmatesoft.svn.core.*; import org.tmatesoft.svn.core.wc.*; import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory; import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; public class Demo { /*第二步: *声明客户端管理类SVNClientManager。 */ private static SVNClientManager ourClientManager; public static void main(String[] args) throws SVNException { /*第三步: * 对版本库进行初始化操作 (在用版本库进行其他操作前必须进行初始化) * 对于通过使用 http:// 和 https:// 访问,执行DAVRepositoryFactory.setup(); * 对于通过使用svn:// 和 svn+xxx://访问,执行SVNRepositoryFactoryImpl.setup(); * 对于通过使用file:///访问,执行FSRepositoryFactory.setup(); * 本程序框架用svn://来访问 */ SVNRepositoryFactoryImpl.setup(); /*第四步: * 要访问版本库的相关变量设置 */ //版本库的URL地址 SVNURL repositoryURL = null; try { repositoryURL = SVNURL.parseURIEncoded("svn://localhost/testRep"); } catch (SVNException e) { // } //版本库的用户名 String name = "userName"; //版本库的用户名密码 String password = "userPassword"; //工作副本目录 String myWorkingCopyPath = "D:/MyWorkingCopy"; //驱动选项 ISVNOptions options = SVNWCUtil.createDefaultOptions(true); /*第五步: * 创建SVNClientManager的实例。提供认证信息(用户名,密码) * 和驱动选项。 */ ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions)options, name, password); /*第六步: * 通过SVNClientManager的实例获取要进行操作的client实例(如 * SVNUpdateClient) * 通过client实例来执行相关的操作。 * 此框架以check out操作来进行说明,其他操作类似。 */ /*工作副本目录创建*/ File wcDir = new File(myWorkingCopyPath); if (wcDir.exists()) { error("the destination directory '" + wcDir.getAbsolutePath() + "' already exists!", null); } wcDir.mkdirs(); try { /* * 递归的把工作副本从repositoryURL check out 到 wcDir目录。 * SVNRevision.HEAD 意味着把最新的版本checked out出来。 */ SVNUpdateClient updateClient = ourClientManager.getUpdateClient(); updateClient.setIgnoreExternals(false); updateClient.doCheckout(repositoryURL,wcDir,SVNRevision.HEAD, SVNRevision.HEAD, true); } catch (SVNException svne) { // } }
六、典型功能实现的范例
环境创建
按快速入门中介绍的方法创建版本库。添加用户test,密码也为test。
启动版本库服务器。访问地址:svn://localhost/。
创建目录:E:\svntest\impDir(把此目录中的内容导入到版本库中)
\impProject
\juniper_config.txt
\cisco_config.txt
E:\svntest\wc(此目录是工作副本目录)
1、Import操作范例
package demo.wc; import java.io.File; import org.tmatesoft.svn.core.SVNCommitInfo; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions; import org.tmatesoft.svn.core.wc.ISVNOptions; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNWCUtil; /*此类执行的操作是把本地目录下的内容上传到版本库中。*/ public class DoImport { //声明SVN客户端管理类 private static SVNClientManager ourClientManager; public static void main(String[] args) throws Exception { //初始化支持svn://协议的库。 必须先执行此操作。 SVNRepositoryFactoryImpl.setup(); //相关变量赋值 SVNURL repositoryURL = null; try { repositoryURL = SVNURL.parseURIEncoded("svn://localhost/"); } catch (SVNException e) { // } String name = "test"; String password = "test"; ISVNOptions options = SVNWCUtil.createDefaultOptions(true); //实例化客户端管理类 ourClientManager = SVNClientManager.newInstance( (DefaultSVNOptions) options, name, password); //要把此目录中的内容导入到版本库 File impDir = new File("e:/svntest/impDir"); //执行导入操作 SVNCommitInfo commitInfo=ourClientManager.getCommitClient().doImport(impDir, repositoryURL, "import operation!",null, false,false,SVNDepth.INFINITY); System.out.println(commitInfo.toString()); } }
2、checkout操作范例
package demo.wc; import java.io.File; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions; import org.tmatesoft.svn.core.wc.ISVNOptions; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc.SVNUpdateClient; import org.tmatesoft.svn.core.wc.SVNWCUtil; /*此类执行的操作是把版本库中的内容check out到本地目录中*/ public class CheckOut { //声明SVN客户端管理类 private static SVNClientManager ourClientManager; public static void main(String[] args) throws Exception { //初始化支持svn://协议的库。 必须先执行此操作。 SVNRepositoryFactoryImpl.setup(); //相关变量赋值 SVNURL repositoryURL = null; try { repositoryURL = SVNURL.parseURIEncoded("svn://localhost/"); } catch (SVNException e) { // } String name = "test"; String password = "test"; ISVNOptions options = SVNWCUtil.createDefaultOptions(true); //实例化客户端管理类 ourClientManager = SVNClientManager.newInstance( (DefaultSVNOptions) options, name, password); //要把版本库的内容check out到的目录 File wcDir = new File("e:/svntest/wc"); //通过客户端管理类获得updateClient类的实例。 SVNUpdateClient updateClient = ourClientManager.getUpdateClient(); /* * sets externals not to be ignored during the checkout */ updateClient.setIgnoreExternals(false); //执行check out 操作,返回工作副本的版本号。 long workingVersion= updateClient .doCheckout(repositoryURL, wcDir, SVNRevision.HEAD, SVNRevision.HEAD, SVNDepth.INFINITY,false); System.out.println("把版本:"+workingVersion+" check out 到目录:"+wcDir+"中。"); } }
3、commit操作范例
注意:执行此操作要先
执行checkout操作。因为本地需要有工作副本此范例才能运行。
package demo.wc; import java.io.File; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions; import org.tmatesoft.svn.core.wc.ISVNOptions; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNStatus; import org.tmatesoft.svn.core.wc.SVNStatusType; import org.tmatesoft.svn.core.wc.SVNWCUtil; /*此类的操作是把工作副本的某个文件提交到版本库中*/ public class DoCommit { // 声明SVN客户端管理类 private static SVNClientManager ourClientManager; public static void main(String[] args) throws Exception { //初始化支持svn://协议的库。 必须先执行此操作。 SVNRepositoryFactoryImpl.setup(); //相关变量赋值 SVNURL repositoryURL = null; try { repositoryURL = SVNURL.parseURIEncoded("svn://localhost/"); } catch (SVNException e) { // } String name = "test"; String password = "test"; ISVNOptions options = SVNWCUtil.createDefaultOptions(true); //实例化客户端管理类 ourClientManager = SVNClientManager.newInstance( (DefaultSVNOptions) options, name, password); //要提交的文件 File commitFile=new File("e:/svntest/wc/impProject/juniper_config.txt"); //获取此文件的状态(是文件做了修改还是新添加的文件?) SVNStatus status=ourClientManager.getStatusClient().doStatus(commitFile, true); //如果此文件是新增加的则先把此文件添加到版本库,然后提交。 if(status.getContentsStatus()==SVNStatusType.STATUS_UNVERSIONED){ //把此文件增加到版本库中 ourClientManager.getWCClient().doAdd(commitFile, false, false, false, SVNDepth.INFINITY,false,false); //提交此文件 ourClientManager.getCommitClient().doCommit( new File[] { commitFile }, true, "",null,null,true, false, SVNDepth.INFINITY); System.out.println("add"); } //如果此文件不是新增加的,直接提交。 else{ // ourClientManager.getCommitClient().doCommit( // new File[] { commitFile }, true, "", false, true); ourClientManager.getCommitClient().doCommit( new File[] { commitFile }, true, "",null,null,true, false, SVNDepth.INFINITY); System.out.println("commit"); } System.out.println(status.getContentsStatus()); } }
4、update操作范例
注意:执行此操作要先执行checkout操作。因为本地需要有工作副本此范例才能运行。
package demo.wc; import java.io.File; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions; import org.tmatesoft.svn.core.wc.ISVNOptions; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc.SVNUpdateClient; import org.tmatesoft.svn.core.wc.SVNWCUtil; /*此类用来把版本库中文件的某个版本更新到工作副本中*/ public class DoUpdate { //声明SVN客户端管理类 private static SVNClientManager ourClientManager; public static void main(String[] args) throws Exception { //初始化支持svn://协议的库。 必须先执行此操作。 SVNRepositoryFactoryImpl.setup(); //相关变量赋值 SVNURL repositoryURL = null; try { repositoryURL = SVNURL.parseURIEncoded("svn://localhost"); } catch (SVNException e) { // } String name = "test"; String password = "test"; ISVNOptions options = SVNWCUtil.createDefaultOptions(true); //实例化客户端管理类 ourClientManager = SVNClientManager.newInstance( (DefaultSVNOptions) options, name, password); //要更新的文件 File updateFile=new File("e:/svntest/wc/impProject/juniper_config.txt"); //获得updateClient的实例 SVNUpdateClient updateClient = ourClientManager.getUpdateClient(); updateClient.setIgnoreExternals(false); //执行更新操作 long versionNum= updateClient.doUpdate(updateFile, SVNRevision.HEAD, SVNDepth.INFINITY,false,false); System.out.println("工作副本更新后的版本:"+versionNum); } }
5、版本差异比较操作范例
注意:执行此操作要先执行checkout操作。因为本地需要有工作副本此范例才能运行。
package demo.wc; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions; import org.tmatesoft.svn.core.wc.ISVNOptions; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNDiffClient; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc.SVNWCUtil; /*此类用来比较某个文件两个版本的差异*/ public class DoDiff { //声明SVN客户端管理类 private static SVNClientManager ourClientManager; public static void main(String[] args) throws Exception { //初始化支持svn://协议的库。 必须先执行此操作。 SVNRepositoryFactoryImpl.setup(); //相关变量赋值 SVNURL repositoryURL = null;//在此例中用不上。 try { repositoryURL = SVNURL.parseURIEncoded("svn://localhost"); } catch (SVNException e) { // } String name = "test"; String password = "test"; ISVNOptions options = SVNWCUtil.createDefaultOptions(true); //实例化客户端管理类 ourClientManager = SVNClientManager.newInstance( (DefaultSVNOptions) options, name, password); //要比较的文件 File compFile = new File("e:/svntest/wc/impProject/juniper_config.txt"); //获得SVNDiffClient类的实例。 SVNDiffClient diff=ourClientManager.getDiffClient(); //保存比较结果的输出流 BufferedOutputStream result =new BufferedOutputStream(new FileOutputStream("E:/result.txt")); //比较compFile文件的SVNRevision.WORKING版本和 SVNRevision.HEAD版本的差异,结果保存在E:/result.txt文件中。 //SVNRevision.WORKING版本指工作副本中当前内容的版本,SVNRevision.HEAD版本指的是版本库中最新的版本。 diff.doDiff(compFile, SVNRevision.HEAD, SVNRevision.WORKING, SVNRevision.HEAD, SVNDepth.INFINITY, true, result,null); result.close(); System.out.println("比较的结果保存在E:/result.txt文件中!"); } }
6、浏览版本库操作范例
此范例用了底层API.和高层API的程序框架有所不同。
package demo.wc; import java.util.Collection; import java.util.Iterator; import org.tmatesoft.svn.core.SVNDirEntry; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNNodeKind; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import org.tmatesoft.svn.core.wc.SVNWCUtil; /* * 此类用来显示版本库的树状结构。 * 此类用底层API(Low Level API)直接访问版本库。 * 此程序框架于1-5的示例(High Level API)稍有不同。 * */ public class DisplayRepositoryTree { public static void main(String[] args) { // 初始化支持svn://协议的库。 必须先执行此操作。 SVNRepositoryFactoryImpl.setup(); /* * 相关变量赋值 */ String url = "svn://localhost"; String name = "test"; String password = "test"; //定义svn版本库的URL。 SVNURL repositoryURL = null; //定义版本库。 SVNRepository repository = null; /* * 实例化版本库类 * */ try { //获取SVN的URL。 repositoryURL=SVNURL.parseURIEncoded(url); //根据URL实例化SVN版本库。 repository = SVNRepositoryFactory.create(repositoryURL); } catch (SVNException svne) { /* * 打印版本库实例创建失败的异常。 */ System.err .println("创建版本库实例时失败,版本库的URL是 '" + url + "': " + svne.getMessage()); System.exit(1); } /* * 对版本库设置认证信息。 */ ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password); repository.setAuthenticationManager(authManager); /* * 上面的代码基本上是固定的操作。 * 下面的部门根据任务不同,执行不同的操作。 * */ try { //打印版本库的根 System.out.println("Repository Root: " + repository.getRepositoryRoot(true)); //打印出版本库的UUID System.out.println("Repository UUID: " + repository.getRepositoryUUID(true)); System.out.println(""); //打印版本库的目录树结构 listEntries(repository, ""); } catch (SVNException svne) { System.err.println("打印版本树时发生错误: " + svne.getMessage()); System.exit(1); } /* * 获得版本库的最新版本树 */ long latestRevision = -1; try { latestRevision = repository.getLatestRevision(); } catch (SVNException svne) { System.err .println("获取最新版本号时出错: " + svne.getMessage()); System.exit(1); } System.out.println(""); System.out.println("---------------------------------------------"); System.out.println("版本库的最新版本是: " + latestRevision); System.exit(0); } /* * 此函数递归的获取版本库中某一目录下的所有条目。 */ public static void listEntries(SVNRepository repository, String path) throws SVNException { //获取版本库的path目录下的所有条目。参数-1表示是最新版本。 Collection entries = repository.getDir(path, -1, null, (Collection) null); Iterator iterator = entries.iterator(); while (iterator.hasNext()) { SVNDirEntry entry = (SVNDirEntry) iterator.next(); System.out.println("/" + (path.equals("") ? "" : path + "/") + entry.getName() + " (author: '" + entry.getAuthor() + "'; revision: " + entry.getRevision() + "; date: " + entry.getDate() + ")"); /* * 检查此条目是否为目录,如果为目录递归执行 */ if (entry.getKind() == SVNNodeKind.DIR) { listEntries(repository, (path.equals("")) ? entry.getName() : path + "/" + entry.getName()); } } } }
7、显示文件内容操作范例
此范例用了底层API.和高层API的程序框架稍有不同。
package demo.wc; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Iterator; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNNodeKind; import org.tmatesoft.svn.core.SVNProperties; import org.tmatesoft.svn.core.SVNProperty; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory; import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import org.tmatesoft.svn.core.wc.SVNWCUtil; /*此类用来显示版本库中文件的内容。 * 此类用底层API(Low Level API)直接访问版本库。 * 此程序框架与1-5的示例稍有不同。 * */ public class DisplayFile { public static void main(String[] args) { //初始化库。 必须先执行此操作。具体操作封装在setupLibrary方法中。 setupLibrary(); /* * 相关变量赋值 */ String url = "svn://localhost"; String name = "test"; String password = "test"; String filePath = "impProject/juniper_config.txt"; //定义svn版本库的URL。 SVNURL repositoryURL = null; //定义版本库。 SVNRepository repository = null; try { //获取SVN的URL。 repositoryURL=SVNURL.parseURIEncoded(url); //根据URL实例化SVN版本库。 repository = SVNRepositoryFactory.create(repositoryURL); } catch (SVNException svne) { /* * 打印版本库实例创建失败的异常。 */ System.err .println("创建版本库实例时失败,版本库的URL是 '" + url + "': " + svne.getMessage()); System.exit(1); } /* * 对版本库设置认证信息。 */ ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password); repository.setAuthenticationManager(authManager); //此变量用来存放要查看的文件的属性名/属性值列表。 SVNProperties fileProperties = new SVNProperties(); //此输出流用来存放要查看的文件的内容。 ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { //获得版本库中文件的类型状态(是否存在、是目录还是文件),参数-1表示是版本库中的最新版本。 SVNNodeKind nodeKind = repository.checkPath(filePath, -1); if (nodeKind == SVNNodeKind.NONE) { System.err.println("要查看的文件在 '" + url + "'中不存在."); System.exit(1); } else if (nodeKind == SVNNodeKind.DIR) { System.err.println("要查看对应版本的条目在 '" + url + "'中是一个目录."); System.exit(1); } //获取要查看文件的内容和属性,结果保存在baos和fileProperties变量中。 repository.getFile(filePath, -1, fileProperties, baos); } catch (SVNException svne) { System.err.println("在获取文件内容和属性时发生错误: " + svne.getMessage()); System.exit(1); } //获取文件的mime-type String mimeType = fileProperties.getStringValue(SVNProperty.MIME_TYPE); //判断此文件是否是文本文件 boolean isTextType = SVNProperty.isTextMimeType(mimeType); /* * 显示文件的所有属性 */ Iterator iterator = fileProperties.nameSet().iterator(); while (iterator.hasNext()) { String propertyName = (String) iterator.next(); String propertyValue = fileProperties.getStringValue(propertyName); System.out.println("文件的属性: " + propertyName + "=" + propertyValue); } /* * 如果文件是文本类型,则把文件的内容显示到控制台。 */ if (isTextType) { System.out.println("File contents:"); System.out.println(); try { baos.writeTo(System.out); } catch (IOException ioe) { ioe.printStackTrace(); } } else { System.out .println("因为文件不是文本文件,无法显示!"); } /* * 获得版本库的最新版本号。 */ long latestRevision = -1; try { latestRevision = repository.getLatestRevision(); } catch (SVNException svne) { System.err.println("获取最新版本号时出错: " + svne.getMessage()); System.exit(1); } System.out.println(""); System.out.println("---------------------------------------------"); System.out.println("版本库的最新版本号: " + latestRevision); System.exit(0); } /* * 初始化库 */ private static void setupLibrary() { /* * For using over http:// and https:// */ DAVRepositoryFactory.setup(); /* * For using over svn:// and svn+xxx:// */ SVNRepositoryFactoryImpl.setup(); /* * For using over file:/// */ FSRepositoryFactory.setup(); } }
七、参考资源
http://www.svnkit.com/documentation.html:里面有SVNKit的介绍及详细的示例代码。
SVNKit工具包中的javadoc文档:里面有详细的类及类方法的介绍。
SVNKit下载地址:http://www.svnkit.com