项目开发过程中代码变化很频繁,需要更新文件时,每次都需要手动制作补丁包,打包成Zip包后更新到生产环境,相当麻烦。
考虑是否可以根据SVN日志,自动生成补丁包。同时生成的输出可以当作更新日志使用。
原理就是自动去复制tomcat下的文件,包括根据src下的java文件去tomcat下查找编译类文件,包括内部类。
支持新增和修改的文件,不支持删除哦~~
于是产生了下面这个工具类。。用到了第三方库Svnkit 请自行导入。
package svnpatch; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNLogEntry; import org.tmatesoft.svn.core.SVNLogEntryPath; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.BasicAuthenticationManager; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc2.ISvnObjectReceiver; import org.tmatesoft.svn.core.wc2.SvnLog; import org.tmatesoft.svn.core.wc2.SvnOperationFactory; import org.tmatesoft.svn.core.wc2.SvnRevisionRange; import org.tmatesoft.svn.core.wc2.SvnTarget; public class PatchMaker_hello { /** * 设置一下 */ public static String destPath = "E:\\update1120\\hello\\"; //输出路径 ,可以自动建立 public static String tomcatPath = "E:\\tomcat\\webapps\\hello\\"; //tomcat的路径,需要包含最新的二进制文件哦 public static String start_date = "20141118000000";//上次更新时间 yyyyMMddHHmmss public static String end_date = "20141120234500";//截至时间 yyyyMMddHHmmss private static Map<String,String> typeDic = new HashMap<String,String>(); static { typeDic.put("M", "修改"); typeDic.put("A", "新增"); } public static void main(String[] args) { final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); final SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); try { //svn的 url final SVNURL url = SVNURL.parseURIEncoded("https://xxx/svn/xxx/hello"); svnOperationFactory.setAuthenticationManager(new BasicAuthenticationManager( "username", "password"));//svn用户名密码 final SvnLog log = svnOperationFactory.createLog(); Date date1 = sdf.parse(start_date); Date date2 = sdf.parse(end_date); log.addRange(SvnRevisionRange.create(SVNRevision.create(date1),SVNRevision.create(date2))); log.setDiscoverChangedPaths(true); log.setSingleTarget(SvnTarget.fromURL(url)); log.setReceiver(new ISvnObjectReceiver<SVNLogEntry>() { public void receive(SvnTarget arg0, SVNLogEntry arg1) throws SVNException { //每个版本执行一次 System.out.println("版本:"+arg1.getRevision()+"===========作者:"+arg1.getAuthor()+"======时间:"+sdf2.format(arg1.getDate())); System.out.println("===修改内容:"+arg1.getMessage()); Map<String,SVNLogEntryPath> map = arg1.getChangedPaths(); if(map.size()>0){ Set set = map.keySet(); for (Iterator iterator = set.iterator(); iterator .hasNext();) { String key = (String) iterator.next(); SVNLogEntryPath path = map.get(key); System.out.println(typeDic.get(path.getType()+"")+":"+key); handleFile(key); } } System.out.println("\n"); } }); log.run(); }catch(Exception ex){ ex.printStackTrace(); } finally { svnOperationFactory.dispose(); } } /** * 缓存 处理重复文件 */ private static Map<String,String> cache = new HashMap<String,String>(); /** * 处理文件 * 方法描述 * @param path */ public static void handleFile(String path){ if(cache.get("path")==null){ if(path.indexOf("/WebRoot/")>-1){ String purePath = path.substring(path.indexOf("/WebRoot/")+9); String srcPath = tomcatPath+purePath.replace("/", "\\"); String desPath = destPath+purePath.replace("/", "\\"); copyFile(srcPath,desPath); }else if(path.indexOf("/src/")>-1){ if(path.toLowerCase().endsWith("java")){ String purePath = path.substring(path.indexOf("/src/")+5); String className = purePath.substring(purePath.lastIndexOf("/")+1).replace(".java", ""); String classPath = purePath.substring(0,purePath.lastIndexOf("/")+1).replace("/", "\\"); String srcPath = tomcatPath+"WEB-INF\\classes\\"+classPath; String desPath = destPath+"WEB-INF\\classes\\"+classPath; copyJava(srcPath,desPath,className); }else{ String purePath = path.substring(path.indexOf("/src/")+5); String srcPath = tomcatPath+"WEB-INF\\classes\\"+purePath.replace("/", "\\"); String desPath = destPath+"WEB-INF\\classes\\"+purePath.replace("/", "\\"); copyFile(srcPath,desPath); } } cache.put(path, "1");//放到缓存 }else{ //处理过了 跳过 } } /** * 复制普通文件 * 方法描述 * @param src * @param dest */ public static void copyFile(String src,String dest){ File destF = new File(dest); if(!destF.getParentFile().exists()){ destF.getParentFile().mkdirs(); } try { File fsrc = new File(src); File fdest = new File(dest); if(fsrc.isDirectory()){ if(!fdest.exists()){ fdest.mkdirs(); } }else{ copyFile(fsrc,fdest); } } catch (IOException e) { e.printStackTrace(); } } /** * 主要是考虑 含有内部类的 java文件 * 方法描述 * @param src * @param dest */ public static void copyJava(String src,String dest,String cname){ File destF = new File(dest); if(!destF.exists()){ destF.mkdirs(); } File srcF = new File(src); File [] files = srcF.listFiles(); for (int i = 0; i < files.length; i++) { if(files[i].getName().startsWith(cname)){ //包含了内部类了吧 String destPath1 = dest+files[i].getName(); try { copyFile(files[i],new File(destPath1)); } catch (IOException e) { e.printStackTrace(); } } } } /** * 复制文件 * 方法描述 * @param sourceFile * @param targetFile * @throws IOException */ public static void copyFile(File sourceFile, File targetFile) throws IOException { BufferedInputStream inBuff = null; BufferedOutputStream outBuff = null; try { // 新建文件输入流并对它进行缓冲 inBuff = new BufferedInputStream(new FileInputStream(sourceFile)); // 新建文件输出流并对它进行缓冲 outBuff = new BufferedOutputStream(new FileOutputStream(targetFile)); // 缓冲数组 byte[] b = new byte[1024 * 5]; int len; while ((len = inBuff.read(b)) != -1) { outBuff.write(b, 0, len); } // 刷新此缓冲的输出流 outBuff.flush(); } finally { // 关闭流 if (inBuff != null) inBuff.close(); if (outBuff != null) outBuff.close(); } } }
相关推荐
为了解决这个问题,我们可以利用版本控制系统如SVN的日志信息,结合自动化脚本来自动生成补丁包。本文将详细介绍如何基于SVN日志使用Python脚本实现这一目标,特别是针对JAVAWEB项目。 首先,理解SVN日志的作用至关...
标题 "根据SVN日志自动生成补丁" 描述了一个基于SVNKit的自动化工具,该工具能够分析SVN(Subversion)的日志,找出在版本控制中的改动,然后将这些改动打包成升级补丁,并生成相应的更新日志。这个过程在软件开发中...
因此,"基于Svn补丁日志自动生成Java项目补丁包[python]"的解决方案应运而生,它通过自动化流程大大简化了这个过程。 该方案的核心是利用Python脚本解析Svn的日志,从中提取出改动的文件信息,然后将这些改动打包成...
标题中的“根据SVN信息自动生成升级补丁包”指的是在软件开发过程中,利用版本控制系统Subversion(SVN)的数据,自动化地创建一个包含了代码差异的补丁包。这个过程通常用于将软件的新功能或修复的bug推送给用户,...
通过这个工具,我们可以从svn的日志中筛选出特定的修改,然后生成只包含这些修改的增量补丁包。 首先,让我们了解什么是svn日志。svn日志记录了项目历史上的每一次提交,包括提交者、提交时间、提交消息等信息。...
总结来说,这个Java Web项目的自动打补丁包流程利用了Maven进行项目构建,通过bat脚本启动自动化,使用SVN记录版本变化,而Python脚本则负责解析日志并智能地更新指定文件。这种自动化方法大大提高了开发效率,降低...
以下是根据标题、描述和部分内容生成的相关知识点。 **1. IDEA导入SVN项目** SVN(Subversion)是一种版本控制系统,用于跟踪代码库中的更改,便于团队协作。在IDEA中导入SVN项目,你需要: - 打开IDEA,选择"VCS...
标题中的“svn结果生成补丁”指的是在使用版本控制系统Subversion(简称svn)时,如何将两个不同版本之间的差异制作成补丁文件的过程。补丁文件通常是一个文本文件,包含了两个版本之间代码或文件的不同之处,可以...
指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间...
Maven是Java的一个项目管理和构建自动化工具,能够处理项目的编译、依赖、文档生成等构建生命周期的各个方面。SVN(Subversion)是一个开源的版本控制系统,用于管理代码的修订版本。Tomcat是一个开源的Web应用...
本篇文章将探讨如何利用Python来自动化地从SVN版本库生成版本号,以辅助软件的发布和维护工作。 首先,我们需要理解`MakeVersion.py`、`VersionConf.py`和`VersionFormat.txt`这三个文件的作用: 1. `MakeVersion....
【标题】"基于JAVAEE的项目管理系统的设计与实现"是一个典型的IT项目,它涉及到了企业级应用程序开发的核心技术,特别是集中在Java Enterprise Edition (JAVAEE)平台上。JAVAEE是用于构建分布式、多层的企业级应用的...
java 写的根据svn信息生成的增量打包工具类,有部分路径和判断条件需要修改,修改正确后可直接执行main方法运行。
【标题】:“基于Maven+SVN自动打包” 在软件开发过程中,自动化构建与版本控制是提高效率的关键步骤。本文将深入探讨如何结合Maven和SVN实现项目的自动打包流程,帮助开发者更有效地管理和部署代码。 【Maven】:...
描述中的“根据文档描述下载该包,根据描述一步一步进行操作即可”意味着这个补丁包提供了一个解决方案,允许用户在线修改svn密码,而无需通过复杂的服务器配置或者用户手动修改配置文件。这大大简化了过程,提高了...
【svn提交日志导出工具v4.5】是一款基于Java Swing界面的实用程序,专为开发者设计,用于轻松地导出Subversion(SVN)仓库的提交日志。该工具利用了强大的SVNKit库,这是一个纯Java实现的SVN客户端库,使开发者能够...
SVN 工程项目, 清理工具 , svn 工程日志全部清理,非常方便使用,清理完成,工程就没有一点svn 日志
根据SVN更新日志,结合eclispse/或其他IDE工具导出war包解压出来就是部署的目录结构了;再把开发的工具和解压的全量更新文件以及导出的SVN更新日志放在同级目录,利用插件把SVN更新日志的增量更新文件提取生成同部署...
代码都是用svn来管理的,但是web项目基本上是...逼急了,自已用access写了一个管理,自动提取两个SVN版本之间的差异,并挑选需要发布的文件,按照目录结构生成patch包,到时将patch包直接拷到测试环境或生成环境即可。
要让VS在编译时根据SVN自动更新版本号,你需要以下步骤: 1. **安装SVN插件**:Visual Studio Marketplace上有许多插件可供选择,如AnkhSVN,它提供与VS集成的SVN支持。安装并配置插件后,VS就能识别到SVN的工作...