由于之前研究过SVNKit相关的使用,有不少同仁咨询我相关的问题,特此示例以供参考。
package org.xiangxji.svn; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.junit.Test; import org.tmatesoft.svn.core.SVNDirEntry; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNNodeKind; import org.tmatesoft.svn.core.SVNProperties; 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.wc.SVNWCUtil; /** * SVNManager SVN 管理器 * @author <a href="xiangxji@gmail.com">xiangxji</a> * @since 2010-03-27 */ public class SVNManager{ private String url = "svn://localhost/"; private String username = "harry"; private String password = "harryssecret"; private SVNRepository repository; /** * 初始化操作 * @throws Exception */ public void initialize() throws Exception { FSRepositoryFactory.setup(); DAVRepositoryFactory.setup(); SVNRepositoryFactoryImpl.setup(); repository = SVNRepositoryFactoryImpl.create(SVNURL .parseURIEncoded(this.url)); ISVNAuthenticationManager authManager = SVNWCUtil .createDefaultAuthenticationManager(this.username, this.password); repository.setAuthenticationManager(authManager); } /** * 从SVN服务器获取文件 * @param filePath 相对于仓库根目录的路径 * @param outputStream 要输出的目标流,可以是文件流 FileOutputStream * @param version 要checkout的版本号 * @return 返回checkout文件的版本号 * @throws Exception 可以自定义Exception */ public long getFileFromSVN(String filePath, OutputStream outputStream, long version) throws Exception { SVNNodeKind node = null; try { node = repository.checkPath(filePath, version); } catch (SVNException e) { throw new Exception("SVN检测不到该文件:" + filePath, e); } if (node != SVNNodeKind.FILE) { throw new Exception(node.toString() + "不是文件"); } SVNProperties properties = new SVNProperties(); try { repository.getFile(filePath, version, properties, outputStream); } catch (SVNException e) { throw new Exception("获取SVN服务器中的" + filePath + "文件失败", e); } return Long.parseLong(properties.getStringValue("svn:entry:revision")); } /** * 获取目录下的所有文件和子目录 * @param res 包含目录参数的资源对象.参加{@link Resource#getPath()} * @return 资源列表 * @throws Exception */ @SuppressWarnings("unchecked") public List<Resource> getChildren(Resource res) throws Exception { String path = res.getPath(); Collection<SVNDirEntry> entries; try { entries = repository.getDir(path, -1, null, (Collection) null); } catch (SVNException e) { throw new Exception("获得" + path + "下级目录失败", e); } List<Resource> result = new ArrayList<Resource>(); for (SVNDirEntry entry : entries) { if (containsSpecialFile(entry)) { Resource resource = new Resource(); resource.setName(entry.getName()); resource.setPath(entry.getURL().getPath()); resource.setFile(entry.getKind() == SVNNodeKind.FILE); result.add(resource); } } return result; } /** * 判断文件是否存在 * @param entry 要判断的节点.参加{@link SVNDirEntry} * @return * @throws Exception */ @SuppressWarnings("unchecked") private boolean containsSpecialFile(SVNDirEntry entry) throws Exception { if (entry.getKind() == SVNNodeKind.FILE) { return true; } else if (entry.getKind() == SVNNodeKind.DIR) { Collection<SVNDirEntry> entries; String path = entry.getURL().getPath(); try { entries = repository.getDir(path, -1, null, (Collection) null); } catch (SVNException e) { throw new Exception("获得" + path + "下级目录失败", e); } for (SVNDirEntry unit : entries) { if (containsSpecialFile(unit)) { return true; } } return false; } return false; } @Test public void testGetFile() { OutputStream outputStream; try { initialize(); String outFileName = "D:/t1/11.txt"; outputStream = new FileOutputStream(outFileName); System.out.println(getFileFromSVN("/t1/11.txt",outputStream,7L)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } @Test public void testGetDir() { try { initialize(); Resource res = new Resource(); res.setPath("/app1/"); List<Resource> rs = getChildren(res); for(Resource r : rs) { System.out.println(r.getFile()?"file:":"directory:" + r.getPath()); } } catch (Exception e) { e.printStackTrace(); } } }
package org.xiangxji.svn; /** * 资源对象 * @author <a href="xiangxji@gmail.com">xiangxji</a> * @since 2010-03-27 */ public class Resource { /** * 相对仓库根目录的路径 */ private String path; /** * 文件/文件夹的名称 */ private String name; /** * 是否是文件 文件:true | 文件夹:false */ private boolean isFile; /** * 版本号 */ private long SVNVersion; /** * 本地路径 */ private String localPath; public String getLocalPath() { return localPath; } public void setLocalPath(String localPath) { this.localPath = localPath; } public long getSVNVersion() { return SVNVersion; } public void setSVNVersion(long sVNVersion) { SVNVersion = sVNVersion; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean getFile() { return isFile; } public void setFile(boolean isFile) { this.isFile = isFile; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } }