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

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

 package lekko.svn;

 import org.tmatesoft.svn.core.SVNException;
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.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.wc.*; import java.io.File; /**
* 默认版本访问的SVNKit工厂
* @author lekko
*/
public class SvnKitFactory { public static ISVNOptions OPTION = SVNWCUtil.createDefaultOptions(true);
private static ISVNAuthenticationManager AUTH; private static SvnKitFactory _instance = new SvnKitFactory2(); private SvnKitFactory() {
init();
} /**
* 单例SVN连接类
*/
public static SvnKitFactory getInstance() {
return _instance;
} /**
* 快速获取连接
*/
public SVNClientManager getClient() {
if (AUTH != null) {
return SVNClientManager.newInstance(OPTION, AUTH);
}
return SVNClientManager.newInstance(OPTION);
} /**
* 对SVNKit连接进行认证,并获取连接
* @param username 用户名
* @param pwd 密码
* @param sshFilePath OpenSSH密钥
*/
public SVNClientManager getAuthClient(String username, String pwd, String sshFilePath) {
File dir = SVNWCUtil.getDefaultConfigurationDirectory();
AUTH = SVNWCUtil.createDefaultAuthenticationManager(dir, username, pwd.toCharArray(), new File(sshFilePath), new char[] {}, true);
return SVNClientManager.newInstance(OPTION, AUTH);
} private void init() {
// HTTP、HTTPS网络
DAVRepositoryFactory.setup();
// SSH网络
SVNRepositoryFactoryImpl.setup();
} public static void main(String[] args) throws SVNException {
SvnKitFactory factory = SvnKitFactory.getInstance();
SVNClientManager manager = factory.getAuthClient("lekko", "", "C:/Users/Public/Documents/lekko.openssh");
SVNWCClient client = manager.getWCClient();
SVNURL url = SVNURL.parseURIEncoded("svn+ssh://lekko@www.webxxx.com/xxx/xxx_rep/test_proj");
SVNInfo info = client.doInfo(url, SVNRevision.HEAD, SVNRevision.HEAD);
System.out.println("OK " + info);
}
}

这里我需要说明几个点:

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”方法,效率更高一些。上代码:

         try {
SVNClientManager manager = SvnKitFactory.getInstance().getClient(); // 尝试使用缓存
manager.getWCClient().doInfo(SVNURL.parseURIEncoded(url), null, SVNRevision.HEAD);
} catch (SVNException e) {
int code = e.getErrorMessage().getErrorCode().getCode();
if (code == 170001) {
try {
SVNClientManager manager = SvnKitFactory.getInstance().getAuthClient(username, pwd, sshfile); // 进行认证
manager.getWCClient().doInfo(SVNURL.parseURIEncoded(url), null, SVNRevision.HEAD);
} catch (SVNException ex) {
logger.error("Auth fail", ex);
}
} else {
_logger.error("Auth fail", e);
}
}

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

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

SVNKit支持SSH连接的更多相关文章

  1. Centos7创建支持ssh服务的docker镜像

    如何在centos7中使用docker创建一个支持ssh连接的容器 1.拉取centos7.4镜像(由于7.4目前是最稳定的版本,所以推荐使用centos7.4) docker pull centos ...

  2. Redis可视化工具(支持ssh链接)

    1.Redis Desktop Manager RedisDesktopManager,简称RDM,这是一款很出名的Redis可视化管理工具,支持Windows,Mac,Ipad,LInux 开源地址 ...

  3. Putty——支持Telnet,ssh连接的连接软件

    简介 PuTTY 的官方网站:http://www.chiark.greenend.org.uk/~sgtatham/putty/,截止到 2007年6月,发布的最高稳定版本是 0.6.PuTTY 是 ...

  4. 001. 使用ssh连接不上centos 6.5的解决方法及其解决中文乱码

    1. 使用ssh连接不上centos 6.5的解决方法: 错误显示: Connecting to 192.168.1.106:22... Could not connect to '192.168.1 ...

  5. SSH连接 NAT型 VirtualBox + LINUX

    1.首先登录到虚拟机中的Linux系统,查看一下使用NAT网卡的IP地址. 2.关闭虚拟机. 3.依次点击 "设置 -> 网络 -> (网络地址转换)端口转发",其中需 ...

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

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

  7. ssh连接原理介绍( 无密码连接登录的原理)

    SSH(Secure  Shell)一种在不安全网络上提供安全远程登录及其它安全网络服务的协议.由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x和2.x.(SSH 2.x的客户程序是不能 ...

  8. [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)

    转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...

  9. 使用Dockerfile创建支持SSH服务的镜像

    1.前面我们学习了使用Dockerfile,那接下来我们就用Dockerfile创建一个支持SSH服务的镜像. 2.首先创建一个目录ssh_centos [root@rocketmq-nameserv ...

随机推荐

  1. IL异常处理

    异常处理在程序中也算是比较重要的一部分了,IL异常处理在C#里面实现会用到一些新的方法 1.BeginExceptionBlock:异常块代码开始,相当于try,但是感觉又不太像 2.EndExcep ...

  2. form表单验证-Javascript

    Form表单验证: js基础考试内容,form表单验证,正则表达式,blur事件,自动获取数组,以及css布局样式,动态清除等.完整代码如下: <!DOCTYPE html PUBLIC &qu ...

  3. Mach-O 的动态链接(Lazy Bind 机制)

    ➠更多技术干货请戳:听云博客 动态链接 要解决空间浪费和更新困难这两个问题最简单的方法就是把程序的模块相互分割开来,形成独立的文件,而不再将它们静态的链接在一起.简单地讲,就是不对那些组成程序的目标文 ...

  4. git 命令总结

    1 删除分支 git push origin :branch name(Task_******) //删除远程分支 git branch -D branch name(Task_******)     ...

  5. MSSQL 事务,视图,索引,存储过程,触发器

    事务 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.这特别适用于多用户同时操作的数据 ...

  6. 使用Xamarin开发iOS7应用时隐藏StatusBar方法

    在iOS7之前如果需要隐藏StatusBar,比较简单,直接在AppDelegate.cs中使用如下代码就可以进行隐藏: UIApplication.SharedApplication.StatusB ...

  7. React 其实比 MVVM 架构更加卡顿

    React 号称通过引入 Virtual DOM 带来了性能的提升,而其实 React 之所以需要 Virtual DOM,是因为它的架构下,state 的变更是全量的,然后触发 render 返回全 ...

  8. [转载]:STM32为什么必须先配置时钟再配置GPIO

    转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...

  9. esayui

  10. javascript中的浮点数运算

    解释一下下面代码的输出 console.log(0.1 + 0.2); //0.30000000000000004 console.log(0.1 + 0.2 == 0.3); //false Jav ...