SVNKit这个开源工具,用于Java语言访问SVN库,咋看的时候很方便,其实坑特别多。我在这里只想跟大家说一句,如果你还没有用过,请不要在生产环境使用这个东西了,兼容性问题搞死你(替换方案是直接用svn命令行,自己组参数调用,然后解析返回数据)。如果你已经入坑,好吧,有问题可以一起交流。

本文讲述SVNKit认证方面的知识,包括常用的http、https格式的svn地址,同时支持svn+ssh格式的svn地址。废话不说,上代码:

 1 package lekko.svn;
 2
 3 import org.tmatesoft.svn.core.SVNException;
 4 import org.tmatesoft.svn.core.SVNURL;
 5 import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
 6 import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
 7 import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
 8 import org.tmatesoft.svn.core.wc.*;
 9
10 import java.io.File;
11
12 /**
13  * 默认版本访问的SVNKit工厂
14  * @author lekko
15  */
16 public class SvnKitFactory {
17
18     public static ISVNOptions OPTION = SVNWCUtil.createDefaultOptions(true);
19     private static ISVNAuthenticationManager AUTH;
20
21     private static SvnKitFactory _instance = new SvnKitFactory2();
22
23     private SvnKitFactory() {
24         init();
25     }
26
27     /**
28      * 单例SVN连接类
29      */
30     public static SvnKitFactory getInstance() {
31         return _instance;
32     }
33
34     /**
35      * 快速获取连接
36      */
37     public SVNClientManager getClient() {
38         if (AUTH != null) {
39             return SVNClientManager.newInstance(OPTION, AUTH);
40         }
41         return SVNClientManager.newInstance(OPTION);
42     }
43
44     /**
45      * 对SVNKit连接进行认证,并获取连接
46      * @param username 用户名
47      * @param pwd 密码
48      * @param sshFilePath OpenSSH密钥
49      */
50     public SVNClientManager getAuthClient(String username, String pwd, String sshFilePath) {
51         File dir = SVNWCUtil.getDefaultConfigurationDirectory();
52         AUTH = SVNWCUtil.createDefaultAuthenticationManager(dir, username, pwd.toCharArray(), new File(sshFilePath), new char[] {}, true);
53         return SVNClientManager.newInstance(OPTION, AUTH);
54     }
55
56     private void init() {
57         // HTTP、HTTPS网络
58         DAVRepositoryFactory.setup();
59         // SSH网络
60         SVNRepositoryFactoryImpl.setup();
61     }
62
63     public static void main(String[] args) throws SVNException {
64         SvnKitFactory factory = SvnKitFactory.getInstance();
65         SVNClientManager manager = factory.getAuthClient("lekko", "", "C:/Users/Public/Documents/lekko.openssh");
66         SVNWCClient client = manager.getWCClient();
67         SVNURL url = SVNURL.parseURIEncoded("svn+ssh://lekko@www.webxxx.com/xxx/xxx_rep/test_proj");
68         SVNInfo info = client.doInfo(url, SVNRevision.HEAD, SVNRevision.HEAD);
69         System.out.println("OK " + info);
70     }
71 }

这里我需要说明几个点:

1、main方法只是用来测试的,可以不要。

2、关于“getAuthClient”的参数,username是必须的,pwd(密码)可以是空字符串“”,sshFilePath(SSH私钥文件路径)也可以是空字符串“”。但是pwd和sshFilePath分别有不同的认证作用,前者是用于HTTP、HTTPS的,后者是用于SSH的。缺少哪个,对应的链接方式就不能正常认证了。

3、Windows用户要特别注意,SSH私钥必须是OpenSSH格式的,如果你是用PuTTYGen生成的密钥,记得转成OpenSSH,不然SVNKit也不能成功使用它进行认证的。

4、SVNKit对用户名与密码是有缓存的,一般缓存的目录与系统的svn命令行一致:

- Windows在C:\Users\用户名\AppData\Roaming\Subversion\auth目录下

- Linux在~/.subversion/auth目录下

5、正由于SVNKit有缓存,所以实际上不需要每次都调用“getAuthClient”方法进行账号认证。我这里推荐大家的调用是这样,在系统初始化时,先调用一次“getClient”,并进行一次doInfo操作,如果异常再使用“getAuthClient”方法进行认证,后续也只需要使用“getClient”方法,效率更高一些。上代码:

 1         try {
 2             SVNClientManager manager = SvnKitFactory.getInstance().getClient();  // 尝试使用缓存
 4             manager.getWCClient().doInfo(SVNURL.parseURIEncoded(url), null, SVNRevision.HEAD);
 5         } catch (SVNException e) {
 6             int code = e.getErrorMessage().getErrorCode().getCode();
 7             if (code == 170001) {
 8                 try {
 9                     SVNClientManager manager = SvnKitFactory.getInstance().getAuthClient(username, pwd, sshfile);    // 进行认证
10                     manager.getWCClient().doInfo(SVNURL.parseURIEncoded(url), null, SVNRevision.HEAD);
11                 } catch (SVNException ex) {
12                     logger.error("Auth fail", ex);
13                 }
14             } else {
15                 _logger.error("Auth fail", e);
16             }
17         }    

可以把它封到你程序启动的时候,或者在失败时弹个框让用户输入什么的。

转载请注明原址:http://www.cnblogs.com/lekko/p/6005382.html

转载于:https://www.cnblogs.com/lekko/p/6005382.html

SVNKit支持SSH连接相关推荐

  1. 在Debian 7/Ubuntu 13.10 上使用隧道封装SSH连接

    隧道 被设计用于远端客户端和本地(可通过inetd启动)或远端服务器间的SSL加密封装.它可以用于为inetd进程增加SSL功能,像POP2(译注:厄,POP2这个服务还有人用么?),POP3和IMA ...

  2. SSH连接原理及ssh-key讲解

    1.1 ssh介绍 SSH是Secure Shell Protocol的简写,由IETF网络工作小组(Network Working Group)制定:在进行数据传输之前,SSH先对联机数据包通过加密 ...

  3. java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...

  4. Loadrunner通过ssh连接linux进行hadoop基准测试

    版权声明:本文为博主原创文章,未经博主允许不得转载.欢迎访问我的博客 https://blog.csdn.net/smooth00/article/details/73796622 Loadrunne ...

  5. iterm2 ssh 乱码_【已解决】Mac中iTerm2通过SSH连接远程服务器

    折腾: [未解决]Mac中用SecureCRT无法用rz上传文件到CentOS服务器 期间,又看到一个: 看到前面不止一个人说是: 给iTerm2安装zmodem ->难道是iTerm2,可以像 ...

  6. 新购阿里云服务器ECS创建之后无法ssh连接的问题处理

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 问题描述 由于原服务器将要到期,因此趁着阿里云搞促销活动重新购买了一 ...

  7. linux 设置ssh并发度,在linux如何使用ControlPersist加快SSH连接速度的问题

    不经意间我们又来到了文章的学习,在众多学习中,我们的文章也许不起眼,但是想必大家都有很多问题吧,所以重要的下面我们就来讲解一下,大家一定要认真看奥!! Linux系统进行服务器配置管理迁移的时候,SS ...

  8. ssh 连接_Docker实战——使用SSH连接docker容器

    简介 什么是Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 L ...

  9. ssh 连接超时 不断开

    可以减少ssh连接超时等待的时间: 方法:ssh -o ConnectTimeout=3 192.168.0.10 或修改sshd_config文件里面的UseDNS 选项,改为UseDNS no. ...

最新文章

  1. 三点弯曲弹性模量怎么计算公式_拉力试验机常用力学计算公式
  2. BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)
  3. 修正mysqlcc在MySQL 5.0上常报的 Table 'xxx' doesn't exist 错误
  4. MyEclipse导入新项目后,不能发布到Tomcat
  5. 欢乐纪中A组赛【2019.8.17】
  6. python-json操作
  7. 我如何进行简历的筛选与人员的选择
  8. WinAPI: SetTimer、KillTimer - 创建与移除高性能定时器
  9. 软件开发整理的一些工具
  10. 基于(7,4 ) 线性分组码编码和 BPSK 调制
  11. 阿里云云效Maven仓库
  12. 用Python实现一个简单的加密程序
  13. markdown表情大全
  14. R语言中的K折交叉验证
  15. 中国富豪第一桶金挖掘的九大方式
  16. 最后采用加权求和的方式得到样本的_论文阅读笔记《Principal characteristic networks for few-shot...
  17. 作物产量常用的单位换算公式
  18. JavaFX开发的地图编辑器WiTKMapEditor(更新GitHub地址)
  19. 如何1分钟实现身份实名认证功能?
  20. 字模的原理和获取(一)

热门文章

  1. WSDL SOAP 绑定
  2. Maven实战(八)——常用Maven插件介绍(下)
  3. Excel批量转为Html,Html转换成Excel
  4. java文件操作大全
  5. 复合索引和一般索引的问题
  6. “短路求值(Short-Circuit Evaluation)
  7. BufferedInputStream
  8. 百战程序员试题与答案(仅供参考)
  9. Binary Tree Non-recursive Traversal
  10. 虚拟机无法开机数据恢复 (建议在做之前做测试,数据双重备份)