- 浏览: 398095 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (760)
- 股票日志 (26)
- Selenium (0)
- selenium 2 环境的搭建 (1)
- 并发 (7)
- 框架开发 (1)
- 动态代理 (2)
- Struts2 (2)
- POI (2)
- jdk (3)
- maven (31)
- spring (35)
- mysql (31)
- 工作机会 (3)
- xtream (1)
- oracle dbms_metadata GET_DDL (0)
- SSI (1)
- DB (61)
- powermock (4)
- java 基础 (25)
- 多线程 (11)
- 高手 (2)
- java 底层 (2)
- 专业网站 (1)
- 开发联想 (1)
- 开发联想 (1)
- bat文件 (2)
- 清queue 语句 (1)
- 清queue 语句 (1)
- jquery (7)
- html5 (1)
- Jenkins (10)
- Linux (17)
- 工作issue (2)
- tomcat log (3)
- jvm (23)
- 项目细节 (0)
- oracle (41)
- 泛型 (3)
- 新知识点 (1)
- 数据库ddl 语句 (0)
- AQ (2)
- jms (0)
- 网络资源 (6)
- github (6)
- Easymock (1)
- Dom 解析XML (1)
- windows命令 (2)
- java (7)
- 正则表达式 (5)
- sequence (1)
- oracle 表meta信息 (1)
- 小工具技巧 (1)
- 辅助工具 (1)
- Junit (1)
- 泛型 generic (2)
- Java程序设计 (1)
- cglib (2)
- 架构师之路 (1)
- 数据库连接池 (5)
- c3p0 (1)
- eclipse使用 (1)
- oracle sql plus (1)
- 码农人生 (3)
- SVN (15)
- sqlplus (2)
- jsoup (1)
- 网络爬虫 (2)
- 新技能 (1)
- zookeeper (4)
- hadoop (1)
- SVNKIT (1)
- 从工具到知识点的整理 (1)
- log4j (13)
- 读文件 (0)
- 转义字符 (1)
- command (1)
- web service (3)
- 锁 (1)
- shell 脚本 (1)
- 遇到的错误 (2)
- tomcat (14)
- 房产 (5)
- bootstrap jquery ui (1)
- easyui (2)
- 个人征信 (1)
- 读写分离 (1)
- 备份 (1)
- rmi (6)
- webservice (1)
- JMX (4)
- 内存管理 (3)
- java设计 (1)
- timer (1)
- lock (2)
- concurrent (2)
- collection (1)
- tns (1)
- java基础 (15)
- File (1)
- 本机资源 (1)
- bat (1)
- windows (4)
- 数据结构 (3)
- 代码安全 (1)
- 作用域 (1)
- 图 (2)
- jvm内存结构 (1)
- 计算机思想 (1)
- quartz (6)
- Mongo DB (2)
- Nosql (4)
- sql (5)
- 第三方Java 工具 jar 项目 (2)
- drools (1)
- java swing (2)
- 调用console (1)
- runtime (1)
- process (1)
- swing (2)
- grouplayout (1)
- dubbo (0)
- bootstrap (0)
- nodejs (2)
- SVN hooks (1)
- jdbc (3)
- jdbc error (1)
- precedure (1)
- partition_key (1)
- active mq (1)
- blob (2)
- Eclipse (6)
- web server (1)
- bootstrapt (2)
- struts (1)
- ajax (1)
- js call back (1)
- 思想境界拓展 (1)
- JIRA (1)
- log (1)
- jaxb (3)
- xml java互相转换 (1)
- 装修 (2)
- 互联网 (2)
- threadlocal (3)
- mybatis (22)
- xstream (1)
- 排序 (1)
- 股票资源 (1)
- RPC (2)
- NIO (3)
- http client (6)
- 他人博客 (1)
- 代理服务器 (1)
- 网络 (2)
- web (1)
- 股票 (5)
- deadlock (1)
- JConsole (2)
- activemq (3)
- oralce (1)
- 游标 (1)
- 12月13日道富内部培训 (0)
- grant (1)
- 速查 (2)
- classloader (4)
- netty (4)
- 设计模式 (2)
- 缓存 (2)
- ehcache (2)
- framework (1)
- 内存分析 (2)
- dump (1)
- memory (2)
- 多高线程,并发 (1)
- hbase (2)
- 分布式系统 (1)
- socket (3)
- socket (1)
- 面试问题 (1)
- jetty (2)
- http (2)
- 源码 (1)
- 日志 (2)
- jni (1)
- 编码约定 (1)
- memorycache (1)
- redis (13)
- 杂谈 (1)
- drool (1)
- blockingqueue (1)
- ScheduledExecutorService (1)
- 网页爬虫 (1)
- httpclient (4)
- httpparser (1)
- map (1)
- 单例 (1)
- synchronized (2)
- thread (1)
- job (1)
- hashcode (1)
- copyonwriteArrayList (2)
- 录制声音 (1)
- java 标准 (2)
- SSL/TLS (1)
- itext (1)
- pdf (1)
- 钻石 (2)
- sonar (1)
- unicode (1)
- 编码 (4)
- html (1)
- SecurityManager (1)
- 坑 (1)
- Restful (2)
- svn hook (1)
- concurrentHashMap (1)
- 垃圾回收 (1)
- vbs (8)
- visual svn (2)
- power shell (1)
- wmi (3)
- mof (2)
- c# (1)
- concurrency (1)
- 劳动法 (1)
- 三国志游戏 (2)
- 三国 (1)
- 洪榕 (2)
- 金融投资知识 (1)
- motan (1)
- tkmybatis mapper (1)
- 工商注册信息查询 (1)
- consul (1)
- 支付业务知识 (2)
- 数据库备份 (1)
- 字段设计 (1)
- 字段 (1)
- dba (1)
- 插件 (2)
- PropEdit插件 (1)
- web工程 (1)
- 银行业知识 (2)
- 国内托管银行 (1)
- 数据库 (1)
- 事务 (2)
- git (18)
- component-scan (1)
- 私人 (0)
- db2 (14)
- alias (1)
- 住房 (1)
- 户口 (1)
- fastjson (1)
- test (6)
- RSA (2)
- 密钥 (1)
- putty (1)
- sftp (1)
- 加密 (1)
- 公钥私钥 (3)
- markdown (1)
- sweet (1)
- sourcetree (1)
- 好工具 (1)
- cmd (1)
- scp (1)
- notepad++ (1)
- ssh免密登录 (1)
- https (1)
- ssl (2)
- js (2)
- h2 (1)
- 内存 (2)
- 浏览器 (1)
- js特效 (1)
- io (1)
- 乱码 (1)
- 小工具 (1)
- 每周技术任务 (1)
- mongodb (7)
- 内存泄漏 (1)
- 码云 (2)
- 如何搭建java 视频服务器 tomcat (1)
- 资源 (1)
- 书 (1)
- 四色建模法 (1)
- 建模 (1)
- 配置 (1)
- 职位 (1)
- nginx (1)
- excel (1)
- log4j2 (2)
- 做菜 (1)
- jmap (1)
- jspwiki (1)
- activiti (1)
- 工作流引擎 (1)
- 安卓 (1)
- acitviti 例子 (1)
- 二维码 (1)
- 工作流 (1)
- powerdesign (2)
- 软件设计 (1)
- 乐观锁 (1)
- 王者荣耀 (1)
- session (2)
- token (5)
- cookie (4)
- springboot (24)
- jwt (2)
- 项目路径 (1)
- magicbook (1)
- requestType (1)
- json (2)
- swagger (1)
- eolinker (1)
- springdata (1)
- springmvc (1)
- controlleradvice (1)
- profile (1)
- 银行四要素 (1)
- 支付人员资源 (1)
- 支付渠道 (1)
- yaml (1)
- 中文编码 (1)
- mongo (2)
- serializable (1)
- 序列化 (1)
- zyd (1)
- unittest (1)
- 工具 (1)
- Something (1)
- 通达信 (1)
- protobuf (1)
- 算法 (1)
- springcloud (2)
- hikari (1)
- rocketmq (7)
- cachecloud (1)
- serfj (1)
- axure (1)
- lombok (1)
- 分布式锁 (1)
- 线程 (2)
- 同步代码块 (1)
- cobar (1)
- mq (1)
- rabbitmq (1)
- 定时执行 (1)
- 支付系统 (3)
- 唱歌 (1)
- elasticjob (1)
- 定时任务 (1)
- 界面 (1)
- flink (2)
- 大数据 (1)
- 接私活 (0)
- 内部培训 (2)
最新评论
-
dannyhz:
做股票从短线 试水,然后 慢慢发现 波段和 中期的故事可挖, ...
搭台唱戏 -
dannyhz:
http://developer.51cto.com/art/ ...
如何自己开发框架 它的注意点是什么
引用
文章主题是svnkit的api操作。所以涉及到其它类的,可以忽略。svnkit有两套api,high level和low level 。high level是操作工作拷贝即working copy的。
我这儿用的就是high level。
checkWorkCopy方法里面,先检查当前指定的路径是否是一个working copy。如果是,执行update操作;
如果不是的话,分两种情况:
1. svn上已经有以此project命名的项目,可能svn上有了,但working copy被删了什么的。就将该project checkout下来;
2. svn上没有该project。此时checkout一个空的东西。SVNDepth.EMPTY,只是让我们的路径成为一个working copy,路径下出现一个.svn目录,svn上面的文件不会被checkout下来。因为我们的svn上可能项目很多。如果把整个上级目录checkout下来会很慢也浪费硬盘空间。
用 svnkit 执行commit操作,概况来说,流程如下:
1. 保证本地path是一个working copy。 即checkWorkCopy方法
2. woking copy可能发生添加,更新,删除等变化操作
3. 检查working copy里面的文件是否under version control。即checkVersiondDirectory方法
4. 执行commit操作
import java.io.File; import org.apache.log4j.Logger; import org.tmatesoft.svn.core.SVNCommitInfo; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNNodeKind; 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.internal.wc.DefaultSVNOptions; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc.SVNStatus; import org.tmatesoft.svn.core.wc.SVNUpdateClient; import org.tmatesoft.svn.core.wc.SVNWCUtil; /** * SVNKit Utility * @author lena yang * */ public class SVNUtil { private static Logger logger = Logger.getLogger(SVNUtil.class); /** * 通过不同的协议初始化版本库 */ public static void setupLibrary() { DAVRepositoryFactory.setup(); SVNRepositoryFactoryImpl.setup(); FSRepositoryFactory.setup(); } /** * 验证登录svn */ public static SVNClientManager authSvn(String svnRoot, String username, String password) { // 初始化版本库 setupLibrary(); // 创建库连接 SVNRepository repository = null; try { repository = SVNRepositoryFactory.create(SVNURL .parseURIEncoded(svnRoot)); } catch (SVNException e) { logger.error(e.getErrorMessage(), e); return null; } // 身份验证 ISVNAuthenticationManager authManager = SVNWCUtil .createDefaultAuthenticationManager(username, password); // 创建身份验证管理器 repository.setAuthenticationManager(authManager); DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(true); SVNClientManager clientManager = SVNClientManager.newInstance(options, authManager); return clientManager; } /** * Make directory in svn repository * @param clientManager * @param url * eg: http://svn.ambow.com/wlpt/bsp/trunk * @param commitMessage * @return * @throws SVNException */ public static SVNCommitInfo makeDirectory(SVNClientManager clientManager, SVNURL url, String commitMessage) { try { return clientManager.getCommitClient().doMkDir( new SVNURL[] { url }, commitMessage); } catch (SVNException e) { logger.error(e.getErrorMessage(), e); } return null; } /** * Imports an unversioned directory into a repository location denoted by a * destination URL * @param clientManager * @param localPath * a local unversioned directory or singal file that will be imported into a * repository; * @param dstURL * a repository location where the local unversioned directory/file will be * imported into * @param commitMessage * @param isRecursive 递归 * @return */ public static SVNCommitInfo importDirectory(SVNClientManager clientManager, File localPath, SVNURL dstURL, String commitMessage, boolean isRecursive) { try { return clientManager.getCommitClient().doImport(localPath, dstURL, commitMessage, null, true, true, SVNDepth.fromRecurse(isRecursive)); } catch (SVNException e) { logger.error(e.getErrorMessage(), e); } return null; } /** * Puts directories and files under version control * @param clientManager * SVNClientManager * @param wcPath * work copy path */ public static void addEntry(SVNClientManager clientManager, File wcPath) { try { clientManager.getWCClient().doAdd(new File[] { wcPath }, true, false, false, SVNDepth.INFINITY, false, false, true); } catch (SVNException e) { logger.error(e.getErrorMessage(), e); } } /** * Collects status information on a single Working Copy item * @param clientManager * @param wcPath * local item's path * @param remote * true to check up the status of the item in the repository, * that will tell if the local item is out-of-date (like '-u' option in the SVN client's * 'svn status' command), otherwise false * @return * @throws SVNException */ public static SVNStatus showStatus(SVNClientManager clientManager, File wcPath, boolean remote) { SVNStatus status = null; try { status = clientManager.getStatusClient().doStatus(wcPath, remote); } catch (SVNException e) { logger.error(e.getErrorMessage(), e); } return status; } /** * Commit work copy's change to svn * @param clientManager * @param wcPath * working copy paths which changes are to be committed * @param keepLocks * whether to unlock or not files in the repository * @param commitMessage * commit log message * @return * @throws SVNException */ public static SVNCommitInfo commit(SVNClientManager clientManager, File wcPath, boolean keepLocks, String commitMessage) { try { return clientManager.getCommitClient().doCommit( new File[] { wcPath }, keepLocks, commitMessage, null, null, false, false, SVNDepth.INFINITY); } catch (SVNException e) { logger.error(e.getErrorMessage(), e); } return null; } /** * Updates a working copy (brings changes from the repository into the working copy). * @param clientManager * @param wcPath * working copy path * @param updateToRevision * revision to update to * @param depth * update的深度:目录、子目录、文件 * @return * @throws SVNException */ public static long update(SVNClientManager clientManager, File wcPath, SVNRevision updateToRevision, SVNDepth depth) { SVNUpdateClient updateClient = clientManager.getUpdateClient(); /* * sets externals not to be ignored during the update */ updateClient.setIgnoreExternals(false); /* * returns the number of the revision wcPath was updated to */ try { return updateClient.doUpdate(wcPath, updateToRevision,depth, false, false); } catch (SVNException e) { logger.error(e.getErrorMessage(), e); } return 0; } /** * recursively checks out a working copy from url into wcDir * @param clientManager * @param url * a repository location from where a Working Copy will be checked out * @param revision * the desired revision of the Working Copy to be checked out * @param destPath * the local path where the Working Copy will be placed * @param depth * checkout的深度,目录、子目录、文件 * @return * @throws SVNException */ public static long checkout(SVNClientManager clientManager, SVNURL url, SVNRevision revision, File destPath, SVNDepth depth) { SVNUpdateClient updateClient = clientManager.getUpdateClient(); /* * sets externals not to be ignored during the checkout */ updateClient.setIgnoreExternals(false); /* * returns the number of the revision at which the working copy is */ try { return updateClient.doCheckout(url, destPath, revision, revision,depth, false); } catch (SVNException e) { logger.error(e.getErrorMessage(), e); } return 0; } /** * 确定path是否是一个工作空间 * @param path * @return */ public static boolean isWorkingCopy(File path){ if(!path.exists()){ logger.warn("'" + path + "' not exist!"); return false; } try { if(null == SVNWCUtil.getWorkingCopyRoot(path, false)){ return false; } } catch (SVNException e) { logger.error(e.getErrorMessage(), e); } return true; } /** * 确定一个URL在SVN上是否存在 * @param url * @return */ public static boolean isURLExist(SVNURL url,String username,String password){ try { SVNRepository svnRepository = SVNRepositoryFactory.create(url); ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password); svnRepository.setAuthenticationManager(authManager); SVNNodeKind nodeKind = svnRepository.checkPath("", -1); return nodeKind == SVNNodeKind.NONE ? false : true; } catch (SVNException e) { e.printStackTrace(); } return false; } } /** * 创建项目框架,SVN提交、更新 * @author lena yang * */ @Service("svnProjectService") public class SvnProjectService { private Logger logger = Logger.getLogger(SvnProjectService.class); // 项目的存放位置 private String workspace = null; private ResourceBundle rb = ResourceBundle.getBundle("application"); // SVN的用户名、密码 private String username = null; private String password = null; private String templete = null; @Resource(name="xcodeService") private XcodeService xcodeService; private void init(){ String webapp = System.getProperty("webapp.root"); if(null!=webapp&&!webapp.endsWith("/") && !webapp.endsWith("\\")){ webapp = webapp + "/"; } // 发布到web服务器以后,有可能WebContent没了 if(new File(webapp + "WebContent").exists()){ webapp = webapp + "WebContent"; } username = rb.getString("svn.username"); password = rb.getString("svn.password"); workspace = rb.getString("project.svn.path"); templete = webapp + "templete"; } public SvnProjectService(){ super(); init(); } /** * 创建项目框架 * @param project * Project * @return */ public boolean createProjectFrame(Project project,List<String> tableNames) { if(project == null){ return false; } File src = new File(templete); // 模板项目的位置 File ws = new File(workspace); // work copy if(!ws.exists()){ ws.mkdirs(); } File dest = new File(workspace + "/" + project.getName()); if(!dest.exists()){ dest.mkdirs(); } checkWorkCopy(project); // 确定工作空间 // 复制模板项目到工作空间 try { FileUtils.copyDirectory(src, dest); } catch (IOException e) { logger.error(e.getMessage(), e); return false; } //修改.project文件中的内容 editProjectFile(project); // 生成框架代码 xcodeService.createBaseFrameWithDatasource(project,tableNames); // 提交到SVN commitProjectToSvn(project); return true; } /** * 修改项目文件 * @param project * @throws DocumentException * @throws IOException */ @SuppressWarnings("unchecked") private void editProjectFile(Project project) { String pro = workspace + "/" + project.getName() + "/"; String settings = pro + ".settings/"; // 1. 修改.settings/org.eclipse.wst.common.component Document document = null; try { document = XmlReaderUtil.getDocument(new File(settings + "org.eclipse.wst.common.component")); } catch (DocumentException e) { e.printStackTrace(); } Element root = document.getRootElement(); root.element("wb-module").attribute("deploy-name") .setValue(project.getName()); if (root.element("wb-module").element("property").attribute("name") .getValue().equals("java-output-path")) { root.element("wb-module").element("property").attribute("value") .setValue("/" + project.getName() + "/build/classes"); } Iterator<Element> itr = (Iterator<Element>) XmlReaderUtil.getElements( document, "//wb-module//property").iterator(); while (itr.hasNext()) { Element element = itr.next(); if ("context-root".equals(element.attribute("name").getValue())) { element.attribute("value").setValue("/" + project.getName()); } } // 将修改后的值写入 XmlReaderUtil.writerXml(document, settings + "org.eclipse.wst.common.component"); // 2. 修改.project try { document = XmlReaderUtil.getDocument(new File(pro + ".project")); XmlReaderUtil.setElementText(document, "//projectDescription", "name", project.getName()); XmlReaderUtil.writerXml(document, pro + ".project"); } catch (DocumentException e) { e.printStackTrace(); } } /** * 从SVN更新项目到work copy * @param project * Project * @return */ public boolean updateProjectFromSvn(Project project) { if(null == project || null == rb.getString("svn.url")){ return false; } project.setSvnUrl(rb.getString("svn.url")); SVNClientManager clientManager = SVNUtil.authSvn(project.getSvnUrl(), username, password); if (null == clientManager) { logger.error("SVN login error! >>> url:" + project.getSvnUrl() + " username:" + username + " password:" + password); return false; } // 注册一个更新事件处理器 clientManager.getCommitClient().setEventHandler(new UpdateEventHandler()); SVNURL repositoryURL = null; try { // eg: http://svn.ambow.com/wlpt/bsp repositoryURL = SVNURL.parseURIEncoded(project.getSvnUrl()).appendPath("trunk/"+project.getName(), false); } catch (SVNException e) { logger.error(e.getMessage(),e); return false; } File ws = new File(new File(workspace), project.getName()); if(!SVNWCUtil.isVersionedDirectory(ws)){ SVNUtil.checkout(clientManager, repositoryURL, SVNRevision.HEAD, new File(workspace), SVNDepth.INFINITY); }else{ SVNUtil.update(clientManager, ws, SVNRevision.HEAD, SVNDepth.INFINITY); } return true; } /** * 提交项目到SVN * @param project * Project * @return */ public boolean commitProjectToSvn(Project project) { SVNClientManager clientManager = SVNUtil.authSvn(project.getSvnUrl(), username, password); clientManager.getCommitClient().setEventHandler(new CommitEventHandler()); File wc_project = new File( workspace + "/" + project.getName()); checkVersiondDirectory(clientManager,wc_project); SVNUtil.commit(clientManager, wc_project, false, "svnkit"); return true; } /** * 递归检查不在版本控制的文件,并add到svn * @param clientManager * @param wc */ private void checkVersiondDirectory(SVNClientManager clientManager,File wc){ if(!SVNWCUtil.isVersionedDirectory(wc)){ SVNUtil.addEntry(clientManager, wc); } if(wc.isDirectory()){ for(File sub:wc.listFiles()){ if(sub.isDirectory() && sub.getName().equals(".svn")){ continue; } checkVersiondDirectory(clientManager,sub); } } } private void checkWorkCopy(Project project){ project.setSvnUrl(rb.getString("svn.url")); SVNClientManager clientManager = SVNUtil.authSvn(project.getSvnUrl(), username, password); SVNURL repositoryURL = null; // trunk try { // eg: http://svn.ambow.com/wlpt/bsp repositoryURL = SVNURL.parseURIEncoded(project.getSvnUrl()) .appendPath("trunk", false); } catch (SVNException e) { logger.error(e.getMessage(),e); } File wc = new File(workspace); File wc_project = new File( workspace + "/" + project.getName()); SVNURL projectURL = null; // projectName try { projectURL = repositoryURL.appendPath(project.getName(), false); } catch (SVNException e) { logger.error(e.getMessage(),e); } if(!SVNUtil.isWorkingCopy(wc)){ if(!SVNUtil.isURLExist(projectURL,username,password)){ SVNUtil.checkout(clientManager, repositoryURL, SVNRevision.HEAD, wc, SVNDepth.EMPTY); }else{ SVNUtil.checkout(clientManager, projectURL, SVNRevision.HEAD, wc_project, SVNDepth.INFINITY); } }else{ SVNUtil.update(clientManager, wc, SVNRevision.HEAD, SVNDepth.INFINITY); } } }
发表评论
-
c#访问visualsvn server, 按照其 mof文件, 控制其服务端的功能,如建用户 设访问权限
2017-05-15 14:59 652https://yq.aliyun.com/articles/ ... -
SVN Server 的mof 文件, 今天的大发现, windows的接口秘密
2017-05-15 14:17 613WMI 的解释 https://msdn.microsoft ... -
一篇关于svn设置的文章,作为入门很好
2017-05-15 10:04 371https://blog.codinghorror.com/s ... -
SVN book
2017-05-25 03:19 346https://www.visualsvn.com/suppo ... -
svn server限制提交使用hook , 参考
2017-05-05 17:39 448估计通过这样的hook手段 来限制提交 权限 参考 这样的 ... -
svn 在我本地的自己总结的内容
2017-05-02 01:15 364引用 Svn server bin下命令 对svn ... -
svn 权限管理
2017-05-02 01:09 468http://www.cnblogs.com/xingchen ... -
自己笔记本电脑的svn server 用户名密码
2016-12-31 16:50 376danny/123456 安装了visual svn之后 就 ... -
eclispe 使用svn 插件,但是反复提醒需要输入svn 密码
2016-10-19 15:01 366把 tortoise svn setting 里面的 save ... -
SVN pre-commit 在 库里 , 项目里阻止ti提交空注释提交
2016-07-19 03:36 785路径: svn库所在 \ 上传项目 \ hooks 文件夹 D ... -
SVN Hook 机制
2016-05-27 15:06 579为了达成Subversion在Commit前后能自行控管,例如 ... -
svn linux 命令
2016-04-19 17:05 342http://www.linuxfromscratch.org ... -
SVN merge 从 trunk 到branch 相关的实践
2016-04-06 21:58 404http://www.blogjava.net/paulwon ... -
使用 java 操作SVN,java所报出的异常
2016-03-14 15:43 548这个: svn 用户名 密码错误 引用 org.tmate ...
相关推荐
SVNKit是一个纯Java实现的Subversion客户端库,无需依赖本地SVN客户端或者C语言的SWIG接口。它为开发者提供了API,可以在不离开Java环境的情况下执行所有常见的SVN操作。此外,SVNKit还支持多种数据库后端,如 ...
SVNKit是一种Java库,它提供了对Subversion版本控制系统的完整接口,允许开发者在Java应用程序中集成Subversion功能。SVNKit开发手册为想要学习SVN二次开发的程序员提供了全面的指南,涵盖了SVNKit的主要组件与用法...
SVNKit通过纯Java实现,无需安装任何本地SVN客户端,因此可以在各种平台如Windows、Linux和Mac OS上运行。该库支持SVN的基本操作,如创建、检查、更新、提交、合并、分支和标签。此外,它还提供了API来处理版本控制...
SVNKit是基于Apache Subversion API的一个纯Java实现,这意味着它无需任何本地SVN客户端即可工作。这使得JSVNKit可以在跨平台的应用程序中无缝运行,无论是Windows、Linux还是Mac OS。 **2. 安装过程** JSVNKit的...
Spring Boot可以通过配置自动连接数据库,并提供JPA(Java Persistence API)或MyBatis等ORM(对象关系映射)工具进行数据操作。 4. **SVN接口**:项目需要与SVN服务器进行交互,获取代码提交记录。这通常涉及到SVN...
3. **svnkit.jar**: SVNKit是一个纯Java实现的Subversion客户端库,允许开发者在Java应用程序中集成Subversion版本控制系统。这个JAR文件是SVNKit的核心库。 4. **sqljet.1.0.3.jar**: SQLJet是一个开源的嵌入式...
- `svnkit.jar`:这是一个纯Java实现的svn客户端库,它提供了与svn服务器通信的API,使得开发者可以在Java应用中直接集成svn功能。 - `sqljet.1.0.4.jar`:SqlJet是一个轻量级的嵌入式数据库引擎,可能被svnkit用来...
- SVNKit是Java实现的Subversion客户端库,它允许Java应用程序(如Eclipse插件)与SVN服务器进行通信。此JAR文件包含所有必要的类和方法,用于执行SVN操作。 5. **sqljet.1.0.2.jar**: - SQLJet是一款开源的...
3. svnkit.jar:这是SVNKit的Java库,它是一个纯Java实现的SVN客户端,允许Eclipse插件在不依赖操作系统特定的SVN库的情况下工作。 4. sqljet.1.0.4.jar:SQLJet是一个开源的嵌入式数据库引擎,用于存储SVN的元数据...
3. svnkit.jar、svnkit-javahl.jar:这两个文件是SVNKit的组成部分,SVNKit是一个纯Java实现的SVN客户端库,支持JNI(Java Native Interface)与SVN库交互。svnkit.jar是主要的库文件,而svnkit-javahl.jar是用于...
SVNKit提供了与Subversion服务器交互的API,支持JavaHL(Java接口到Subversion的本机库)和纯Java实现。 4. sqljet.1.0.1.jar:SQLJet是一个开源的嵌入式数据库引擎,它允许在Java应用程序中直接操作SQLite数据库。...
3. svnkit.jar:这是 SVNKit 的 JAR 文件,一个纯 Java 实现的 SVN 客户端库,用于在 Java 应用程序中实现 SVN 功能。 4. sqljet.1.0.4.jar:SQLJet 是一个轻量级的嵌入式 SQL 数据库引擎,可能被 SVNKit 使用来存储...
它为Java应用提供了一个更接近底层的接口,性能可能会优于纯Java的SVNKit。 JAVAHL-LICENSE:同COPYING,这个文件包含了JavaHL的许可信息,解释了使用JavaHL库的条件和限制。 .options:这可能是Eclipse特定的配置...
3. **svnkit.jar**: SVNKit是Java实现的SVN客户端库,它允许开发者在Java应用程序中直接与SVN服务器通信。这个JAR文件是插件的核心部分,提供了SVN操作的API。 4. **sqljet.1.0.2.jar**: SQLJet是一个开源的嵌入式...
ANTLR是一个强大的解析器生成器,而JavaHL是SVN的一个纯Java实现,它提供了更高效的性能,尤其是对于那些不支持JNI(Java Native Interface)的环境。 COPYING文件通常包含了开源软件的版权和许可信息,例如GPL...
3. svnkit.jar 和 svnkit-javahl.jar:这两个文件是 SVNKit 的核心组件,SVNKit 是一个纯 Java 实现的 SVN 客户端库。svnkit.jar 提供了主要的 SVN 功能,而 svnkit-javahl.jar 是一个接口,用于使用 JavaHL(Java ...
标题 "myeclipse8.6svn" 暗示了这是一个关于如何...同时,它也可能涉及到了一些其他的开发工具或库,如SQLJet用于数据库操作,ANTLR用于解析和生成语法。如果需要更详细的教程或操作指南,可以参考博文链接提供的内容。
3. svnkit.jar:这是SVNKit库的JAR文件,它是一个纯Java实现的SVN客户端API,用于在Java应用中与Subversion服务器交互。 4. sqljet.1.0.4.jar:SqlJet是一个开源的嵌入式数据库引擎,可能被用于存储SVN的元数据或...
3. **svnkit.jar**:这是SVNKit库的JAR文件,它是一个纯Java实现的Subversion客户端API,允许在Java应用中直接与Subversion服务器通信。 4. **sqljet.1.0.1.jar**:SQLJet是开源的嵌入式数据库引擎,可能在Eclipse ...