`
namezhou
  • 浏览: 158715 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

根据SVN日志自动生成补丁包[基于Tomcat的JavaEE项目]

阅读更多

项目开发过程中代码变化很频繁,需要更新文件时,每次都需要手动制作补丁包,打包成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();
        }
    }
}

 

分享到:
评论

相关推荐

    JAVA项目根据SVN日志自动生成补丁包

    为了解决这个问题,我们可以利用版本控制系统如SVN的日志信息,结合自动化脚本来自动生成补丁包。本文将详细介绍如何基于SVN日志使用Python脚本实现这一目标,特别是针对JAVAWEB项目。 首先,理解SVN日志的作用至关...

    根据SVN日志自动生成补丁

    标题 "根据SVN日志自动生成补丁" 描述了一个基于SVNKit的自动化工具,该工具能够分析SVN(Subversion)的日志,找出在版本控制中的改动,然后将这些改动打包成升级补丁,并生成相应的更新日志。这个过程在软件开发中...

    基于Svn补丁日志自动生成Java项目补丁包[python]

    因此,"基于Svn补丁日志自动生成Java项目补丁包[python]"的解决方案应运而生,它通过自动化流程大大简化了这个过程。 该方案的核心是利用Python脚本解析Svn的日志,从中提取出改动的文件信息,然后将这些改动打包成...

    根据SVN信息自动生成升级补丁包

    标题中的“根据SVN信息自动生成升级补丁包”指的是在软件开发过程中,利用版本控制系统Subversion(SVN)的数据,自动化地创建一个包含了代码差异的补丁包。这个过程通常用于将软件的新功能或修复的bug推送给用户,...

    svn 日志导出 增量补丁工具

    通过这个工具,我们可以从svn的日志中筛选出特定的修改,然后生成只包含这些修改的增量补丁包。 首先,让我们了解什么是svn日志。svn日志记录了项目历史上的每一次提交,包括提交者、提交时间、提交消息等信息。...

    java web项目自动打补丁包 web工程项目 自动化 补丁包

    总结来说,这个Java Web项目的自动打补丁包流程利用了Maven进行项目构建,通过bat脚本启动自动化,使用SVN记录版本变化,而Python脚本则负责解析日志并智能地更新指定文件。这种自动化方法大大提高了开发效率,降低...

    IDEA导入SVN项目(WEB)配置tomcat部署项目.docx

    以下是根据标题、描述和部分内容生成的相关知识点。 **1. IDEA导入SVN项目** SVN(Subversion)是一种版本控制系统,用于跟踪代码库中的更改,便于团队协作。在IDEA中导入SVN项目,你需要: - 打开IDEA,选择"VCS...

    svn结果生成补丁

    标题中的“svn结果生成补丁”指的是在使用版本控制系统Subversion(简称svn)时,如何将两个不同版本之间的差异制作成补丁文件的过程。补丁文件通常是一个文本文件,包含了两个版本之间代码或文件的不同之处,可以...

    python获取SVN日志

    指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间...

    Jenkins+Maven+SVN+Tomcat 持续集成环境快捷部署

    Maven是Java的一个项目管理和构建自动化工具,能够处理项目的编译、依赖、文档生成等构建生命周期的各个方面。SVN(Subversion)是一个开源的版本控制系统,用于管理代码的修订版本。Tomcat是一个开源的Web应用...

    根据svn版本库自动生成版本号

    本篇文章将探讨如何利用Python来自动化地从SVN版本库生成版本号,以辅助软件的发布和维护工作。 首先,我们需要理解`MakeVersion.py`、`VersionConf.py`和`VersionFormat.txt`这三个文件的作用: 1. `MakeVersion....

    基于JAVAEE的项目管理系统的设计与实现

    【标题】"基于JAVAEE的项目管理系统的设计与实现"是一个典型的IT项目,它涉及到了企业级应用程序开发的核心技术,特别是集中在Java Enterprise Edition (JAVAEE)平台上。JAVAEE是用于构建分布式、多层的企业级应用的...

    java 写的根据svn信息生成的增量打包

    java 写的根据svn信息生成的增量打包工具类,有部分路径和判断条件需要修改,修改正确后可直接执行main方法运行。

    基于Maven+SVN自动打包

    【标题】:“基于Maven+SVN自动打包” 在软件开发过程中,自动化构建与版本控制是提高效率的关键步骤。本文将深入探讨如何结合Maven和SVN实现项目的自动打包流程,帮助开发者更有效地管理和部署代码。 【Maven】:...

    svn修改密码的补丁包

    描述中的“根据文档描述下载该包,根据描述一步一步进行操作即可”意味着这个补丁包提供了一个解决方案,允许用户在线修改svn密码,而无需通过复杂的服务器配置或者用户手动修改配置文件。这大大简化了过程,提高了...

    svn提交日志导出工具v4.5

    【svn提交日志导出工具v4.5】是一款基于Java Swing界面的实用程序,专为开发者设计,用于轻松地导出Subversion(SVN)仓库的提交日志。该工具利用了强大的SVNKit库,这是一个纯Java实现的SVN客户端库,使开发者能够...

    SVNClear svn 日志清理脚本

    SVN 工程项目, 清理工具 , svn 工程日志全部清理,非常方便使用,清理完成,工程就没有一点svn 日志

    根据SVN的更新日志导出部署目录结构的更新文件

    根据SVN更新日志,结合eclispse/或其他IDE工具导出war包解压出来就是部署的目录结构了;再把开发的工具和解压的全量更新文件以及导出的SVN更新日志放在同级目录,利用插件把SVN更新日志的增量更新文件提取生成同部署...

    自动生成SVN发布包

    代码都是用svn来管理的,但是web项目基本上是...逼急了,自已用access写了一个管理,自动提取两个SVN版本之间的差异,并挑选需要发布的文件,按照目录结构生成patch包,到时将patch包直接拷到测试环境或生成环境即可。

    VS编译发布根据SVN自动更新版本号

    要让VS在编译时根据SVN自动更新版本号,你需要以下步骤: 1. **安装SVN插件**:Visual Studio Marketplace上有许多插件可供选择,如AnkhSVN,它提供与VS集成的SVN支持。安装并配置插件后,VS就能识别到SVN的工作...

Global site tag (gtag.js) - Google Analytics