SVNKit支持SSH鏈接

    SVNKit這個開源工具,用於Java語言訪問SVN庫,咋看的時候很方便,其實坑特別多。我在這裏只想跟你們說一句,若是你尚未用過,請不要在生產環境使用這個東西了,兼容性問題搞死你(替換方案是直接用svn命令行,本身組參數調用,而後解析返回數據)。若是你已經入坑,好吧,有問題能夠一塊兒交流。html

    本文講述SVNKit認證方面的知識,包括經常使用的http、https格式的svn地址,同時支持svn+ssh格式的svn地址。廢話不說,上代碼:java

 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 }

   

    這裏我須要說明幾個點:web

    一、main方法只是用來測試的,能夠不要。緩存

    二、關於「getAuthClient」的參數,username是必須的,pwd(密碼)能夠是空字符串「」,sshFilePath(SSH私鑰文件路徑)也能夠是空字符串「」。可是pwd和sshFilePath分別有不一樣的認證做用,前者是用於HTTP、HTTPS的,後者是用於SSH的。缺乏哪一個,對應的連接方式就不能正常認證了。網絡

    三、Windows用戶要特別注意,SSH私鑰必須是OpenSSH格式的,若是你是用PuTTYGen生成的密鑰,記得轉成OpenSSH,否則SVNKit也不能成功使用它進行認證的。ssh

    四、SVNKit對用戶名與密碼是有緩存的,通常緩存的目錄與系統的svn命令行一致:svn

        - Windows在C:\Users\用戶名\AppData\Roaming\Subversion\auth目錄下工具

        - Linux在~/.subversion/auth目錄下測試

    五、正因爲SVNKit有緩存,因此實際上不須要每次都調用「getAuthClient」方法進行帳號認證。我這裏推薦你們的調用是這樣,在系統初始化時,先調用一次「getClient」,並進行一次doInfo操做,若是異常再使用「getAuthClient」方法進行認證,後續也只須要使用「getClient」方法,效率更高一些。上代碼:url

 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

相關文章
相關標籤/搜索