项目开发过程中代码变化很频繁,需要更新文件时,每次都需要手动制作补丁包,打包成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补丁日志,自动生成补丁包,解决在JAVA开发时打补丁的麻烦。 注:此脚本仅针对JAVAWEB项目,其他种类也可自行更改
用SVNKit制作的自动打包程序,根据SVN提交日志自动打包改动过的文件,制作升级补丁并生成更新日志。
根据SVN补丁日志,自动生成补丁包,解决在JAVA开发时打补丁的麻烦。 注:此脚本仅针对JAVAWEB项目,其他种类也可自行更改
NULL 博文链接:https://zhangzhenting.iteye.com/blog/671043
通过svn提交日志查询筛选,导出选定的修改部分,生成增量补丁包
IDEA导入SVN项目(WEB)配置tomcat部署项目
1、通过bat实现,更新部署(maven方式),之后svn -log 记录更新日志,之后python根据更新日志,替换相应的文件;
能够将Java代码自动生成补丁
指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间...
jenkins+maven+svn+tomcat 持续集成环境快捷部署,实现自动编译打包部署
java 写的根据svn信息生成的增量打包工具类,有部分路径和判断条件需要修改,修改正确后可直接执行main方法运行。
SVN 工程项目, 清理工具 , svn 工程日志全部清理,非常方便使用,清理完成,工程就没有一点svn 日志
代码都是用svn来管理的,但是web项目基本上是...逼急了,自已用access写了一个管理,自动提取两个SVN版本之间的差异,并挑选需要发布的文件,按照目录结构生成patch包,到时将patch包直接拷到测试环境或生成环境即可。
用python实现版本号的自动生成。 用法在这里:http://blog.csdn.net/riag/archive/2007/05/28/1628530.aspx
清楚svn目录下生成的.svn所有文件夹
1.项目使用方法: http://blog.csdn.net/w329636271/article/details/52083934 2.用于svn对比结果的打包
JavaEE6 SVN
根据SVN更新日志,结合eclispse/或其他IDE工具导出war包解压出来就是部署的目录结构了;再把开发的工具和解压的全量更新文件以及导出的SVN更新日志放在同级目录,利用插件把SVN更新日志的增量更新文件提取生成同部署...
Windows下实现的,git的自动拉取推送,svn的自动拉取和推送,maven自动编译,angular的自动打包发布,bat脚本