1.pom文件中引入jar包:
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
<version>1.9.3</version>
</dependency>
2.svn操作代码
public class SVNKit {
protected static Logger logger = LoggerFactory.getLogger(SVNKit.class);
// 更新状态 true:没有程序在执行更新,反之则反
private static Boolean DoUpdateStatus = true;
// 声明SVN客户端管理类
private static SVNClientManager ourClientManager;
/**
* 检查任务文件是否存在
* @param userName svn用户名
* @param password svn用户密码
* @param svnUrl 文件存放路径
* @param path 相对路径
* @return 结果
* @throws SVNException svn异常
*/
public static boolean checkPath(String userName,String password,String svnUrl,String path) throws SVNException {
DAVRepositoryFactory.setup();
SVNURL repositoryURL = null;
boolean isExist = false;
try {
repositoryURL = SVNURL.parseURIEncoded(svnUrl);
} catch (SVNException e) {
logger.warn("svn地址格式错误",e);
throw new SVNException(e.getErrorMessage());
}
SVNRepository svnRepository = SVNRepositoryFactory.create(repositoryURL);
ISVNAuthenticationManager isvnAuthenticationManager = SVNWCUtil
.createDefaultAuthenticationManager(userName, password);
svnRepository.setAuthenticationManager(isvnAuthenticationManager);
SVNNodeKind node = null;
node = svnRepository.checkPath(path, -1);
if(node == SVNNodeKind.DIR) {
Collection entries = svnRepository.getDir(path, -1, null, (Collection)null);
Iterator iterator = entries.iterator();
if(iterator.hasNext()) {
SVNDirEntry entry = (SVNDirEntry)iterator.next();
if(entry.getKind() == SVNNodeKind.FILE) {
logger.debug("svn中文件路径:"+svnUrl+"/"+path + "下任务文件存在,文件名称:" +entry.getName());
isExist = true;
}
}
}
logger.debug("检查svn中文件路径:"+svnUrl+"/"+path+"下任务文件是否存在,结果:"+isExist);
return isExist;
}
/**
* 增加svn目录
* @param userName svn用户名
* @param password svn用户密码
* @param svnUrl svn地址
* @param adddir 需要增加的目录
* @return 执行结果
* @throws SVNException svn处理异常
*/
public static Boolean addDir(String userName,String password,String svnUrl, String adddir) throws SVNException {
DAVRepositoryFactory.setup();
SVNURL repositoryURL = null;
try {
repositoryURL = SVNURL.parseURIEncoded(svnUrl);
} catch (SVNException e) {
logger.warn("svn地址格式错误",e);
throw new SVNException(e.getErrorMessage());
}
SVNRepository svnRepository = SVNRepositoryFactory.create(repositoryURL);
ISVNAuthenticationManager isvnAuthenticationManager = SVNWCUtil
.createDefaultAuthenticationManager(userName, password);
svnRepository.setAuthenticationManager(isvnAuthenticationManager);
ISVNEditor editor = null;
try {
editor = svnRepository.getCommitEditor("add dir", null, true, null);
editor.openRoot(-1);
// 新增目录
editor.addDir(adddir, null, -1);
editor.closeDir();
editor.closeDir();
editor.closeEdit();
logger.debug("在svn路径:"+svnUrl+"下增加目录:" + adddir +" 成功。");
} catch (SVNException e) {
if(editor != null) {
editor.abortEdit();
}
logger.warn("在svn路径:"+svnUrl+"下增加目录:" + adddir+" 失败。",e);
throw new SVNException(e.getErrorMessage());
}
return true;
}
/**
* svn检出
* @param userName svn用户名
* @param password svn用户密码
* @param svnUrl svn地址
* @param filePath 检出到文件路径
* @return 检出结果
* @throws SVNException svn处理异常
*/
public static Boolean checkOut(String userName,String password,String svnUrl, String filePath) throws SVNException {
// 初始化库。 必须先执行此操作。具体操作封装在setupLibrary方法中。
/*
* For using over http:// and https://
*/
DAVRepositoryFactory.setup();
/*
* For using over svn:// and svn+xxx://
*/
//SVNRepositoryFactoryImpl.setup();
/*
* For using over file:///
*/
//FSRepositoryFactory.setup();
// 相关变量赋值
SVNURL repositoryURL = null;
try {
repositoryURL = SVNURL.parseURIEncoded(svnUrl);
} catch (SVNException e) {
logger.warn("svn地址格式错误",e);
throw new SVNException(e.getErrorMessage());
}
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, userName, password);
// 要把版本库的内容check out到的目录
File wcDir = new File(filePath);
// 通过客户端管理类获得updateClient类的实例。
SVNUpdateClient updateClient = ourClientManager.getUpdateClient();
updateClient.setIgnoreExternals(false);
// 执行check out 操作,返回工作副本的版本号。
long workingVersion = -1;
workingVersion = updateClient.doCheckout(repositoryURL, wcDir, SVNRevision.HEAD, SVNRevision.HEAD, SVNDepth.INFINITY, false);
logger.debug("把版本:" + workingVersion + " check out 到目录:" + wcDir + "中。");
return true;
}
/**
* 清理目录下的svn信息
* @param userName svn用户名
* @param password svn用户密码
* @param filePath 文件夹路径
* @return 执行结果
*/
public static Boolean doCleanup(String userName,String password,String filePath) {
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, userName, password);
// 要把版本库的内容check out到的目录
File wcDir = new File(filePath);
if (wcDir.exists()) {
try {
ourClientManager.getWCClient().doCleanup(wcDir);
} catch (SVNException e) {
// e.printStackTrace();
return false;
}
} else {
return false;
}
return true;
}
/**
* 更新svn
* @param userName svn用户名
* @param password svn用户密码
* @param filePath 文件路径
* @return int(-1更新失败,1成功,0有程序在占用更新)
*/
public static int doUpdate(String userName,String password,String filePath) {
if (!DoUpdateStatus) {
logger.debug("更新程序已经在运行中,不能重复请求!");
return 0;
}
DoUpdateStatus = false;
/*
* For using over http:// and https://
*/
try {
DAVRepositoryFactory.setup();
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, userName, password);
// 要更新的文件
File updateFile = new File(filePath);
// 获得updateClient的实例
SVNUpdateClient updateClient = ourClientManager.getUpdateClient();
updateClient.setIgnoreExternals(false);
// 执行更新操作
long versionNum = updateClient.doUpdate(updateFile, SVNRevision.HEAD, SVNDepth.INFINITY, false, false);
logger.debug("工作副本更新后的版本:" + versionNum);
DoUpdateStatus = true;
return 1;
} catch (SVNException e) {
DoUpdateStatus = true;
// e.printStackTrace();
return -1;
}
}
/**
* 提价svn
* @param userName svn用户名
* @param password svn用户密码
* @param filePath 待提交文件目录
* @return 提交结果
* @throws SVNException svn异常
*/
public static Boolean doCommit(String userName,String password,String filePath) throws SVNException {
// 注意:执行此操作要先执行checkout操作。因为本地需要有工作副本此范例才能运行。
// 初始化支持svn://协议的库 和http:// and https://
SVNRepositoryFactoryImpl.setup();
DAVRepositoryFactory.setup();
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, userName, password);
// 要提交的文件夹
File commitFile = new File(filePath);
// 获取此文件的状态(是文件做了修改还是新添加的文件?)
SVNStatus status = null;
File addFile = null;
if (filePath != null && filePath.trim().length() > 0) {
addFile = new File(filePath);
status = ourClientManager.getStatusClient().doStatus(addFile, true);
// 如果此文件是新增加的则先把此文件添加到版本库,然后提交。
if (null == status || status.getContentsStatus() == SVNStatusType.STATUS_UNVERSIONED) {
// 把此文件增加到版本库中
ourClientManager.getWCClient().doAdd(addFile, false, false, false, SVNDepth.INFINITY, false, false);
logger.debug("add,新增文件添加到版本库。");
}
// 提交此文件
ourClientManager.getCommitClient().doCommit(new File[] { commitFile }, true, "", null, null, true, false,
SVNDepth.INFINITY);
logger.debug("commit,提交本地路径: " + filePath +"文件成功。");
}
// 如果此文件不是新增加的,直接提交。
else {
ourClientManager.getCommitClient().doCommit(new File[] { commitFile }, true, "", null, null, true, false,
SVNDepth.INFINITY);
logger.debug("commit,提交本地路径: " + filePath +"文件成功。");
}
return true;
}
/**
* 将文件导入并提交到svn 同路径文件要是已经存在将会报错
*
* @param userName svn用户名
* @param password svn用户密码
* @param dirPath 文件所在文件夹的路径
* @return Boolean 返回结果
* @throws SVNException svn异常
*/
public static Boolean doImport(String userName,String password,String dirPath) throws SVNException {
/*
* For using over http:// and https://
*/
DAVRepositoryFactory.setup();
// 相关变量赋值
SVNURL repositoryURL = null;
try {
repositoryURL = SVNURL.parseURIEncoded(dirPath);
} catch (SVNException e) {
logger.warn("svn地址格式错误",e);
throw new SVNException(e.getErrorMessage());
}
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, userName, password);
// 要把此目录中的内容导入到版本库
File impDir = new File(dirPath);
// 执行导入操作
SVNCommitInfo commitInfo = ourClientManager.getCommitClient().doImport(impDir, repositoryURL, "import operation!", null, false, false, SVNDepth.INFINITY);
logger.debug(commitInfo.toString());
return true;
}
}