下面的代码是maven版本

1. 创建patch.txt增量文件

保存到 文件目录下

比如 E:\aa\patch.txt

2. 编写java代码

package utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/*
* 利用svn的补丁文件打包生成增量文件
* 参考 https://blog.csdn.net/happydecai/article/details/81940484
*
* */ public class FreePatchUtil {
public static String patchFile = "E:\\patch.txt";// 补丁文件,由eclipse svn plugin生成
public static String projectPath ="E:\\Projects\\SourceCode\\adpp";// "D:\\javaprojects\\portal\\tepin-manage";// 项目文件夹路径
public static String webContent = "src/main/webapp";// web应用文件夹名
public static String classPath ="F:\\tomcat-7.0.69\\webapps\\adpp\\WEB-INF\\classes"; //"D:\\javaprojects\\portal\\tepin-manage\\target\\classes";// class存放路径
public static String desPath ="E:\\zengliangbao" ;//"C:\\Users\\sz\\Documents\\portal_for_bi";// 补丁文件包存放路径
public static String version = "patch_20190411";//+UtilDateTime.getNowTime().substring(0, 10);// 补丁版本
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
copyFiles(getPatchFileList());
} /****
* 读取补丁配置文件解析出修改的文件并返回到list集合
*
* @return
* @throws Exception
*/
public static List<String> getPatchFileList() throws Exception {
List<String> fileList = new ArrayList<String>();
FileInputStream f = new FileInputStream(patchFile);
BufferedReader dr = new BufferedReader(new InputStreamReader(f, "utf-8"));
String line;
while ((line = dr.readLine()) != null) {
if (line.startsWith("Index:")) {
line = line.replaceAll(" ", "");
line = line.substring(line.indexOf(":") + 1, line.length());
fileList.add(line);
}
}
dr.close();
return fileList;
} /***
*
* @param list
* 修改的文件
*/
public static void copyFiles(List<String> list) { for (String fullFileName : list) {
if (fullFileName.indexOf("src/main/webapp") == -1) {// 对源文件目录下的文件处理
String fileName = fullFileName.replace("src", "");//目标路径
fullFileName = classPath + fileName;
if (fileName.endsWith(".java")) {
// fileName = fileName.replace(".java", ".class").replace("/main/java", "");
// fullFileName = fullFileName.replace(".java", ".class").replace("/main/java", "");
int i= fileName.indexOf("/com");
//System.out.println(i);
if (i>0) {
fileName=fileName.substring(i);
}
//System.out.println(fileName);
fileName = fileName.replace(".java", ".class").replace("/main/java", "");
//System.out.println(fileName);
fullFileName = classPath + fileName;
fullFileName = fullFileName.replace(".java", ".class").replace("/main/java", "");
//System.out.println("fullFileName>"+fullFileName);
}else{
fileName = fileName.replace("/main/resources", "");
fullFileName = fullFileName.replace("/main/resources", "");
}
String tempDesPath = fileName.substring(0,fileName.lastIndexOf("/"));
String desFilePathStr = desPath + "/" + version + "/WEB-INF/classes" + tempDesPath;
String desFileNameStr = desPath + "/" + version + "/WEB-INF/classes" + fileName;
File desFilePath = new File(desFilePathStr);
if (!desFilePath.exists()) {
desFilePath.mkdirs();
}
copyFile(fullFileName, desFileNameStr);
System.out.println(fullFileName + "复制完成");
// 遍历目录,是否存在内部类,如果有内部,则将所有的额内部类挑选出来放到
//copyInnerClassFile(fullFileName, desFileNameStr);
} else {// 对普通目录的处理
String desFileName = fullFileName.replace(webContent, "");
fullFileName = projectPath + "/" + fullFileName;// 将要复制的文件全路径
String fullDesFileNameStr = desPath + "/" + version + "/" + desFileName;
String desFilePathStr = fullDesFileNameStr.substring(0,fullDesFileNameStr.lastIndexOf("/"));
File desFilePath = new File(desFilePathStr);
if (!desFilePath.exists()) {
desFilePath.mkdirs();
}
copyFile(fullFileName, fullDesFileNameStr);
System.out.println(fullFileName + "复制完成"); } } } /***
* 处理内部类的情况 解析源路径名称,遍历此文件路径下是否存在这个类的内部类 内部类编译后的格式一般是
* OuterClassName$InnerClassName.class
*
* @param sourceFullFileName
* 原路径
* @param desFullFileName
* 目标路径
*/
@SuppressWarnings("unused")
private static void copyInnerClassFile(String sourceFullFileName,String desFullFileName) {
String sourceFileName = sourceFullFileName.substring(sourceFullFileName.lastIndexOf("/") + 1);
String sourcePackPath = sourceFullFileName.substring(0, sourceFullFileName.lastIndexOf("/"));
String destPackPath = desFullFileName.substring(0, desFullFileName.lastIndexOf("/"));
String tempFileName = sourceFileName.split("\\.")[0];
File packFile = new File(sourcePackPath);
if (packFile.isDirectory()) {
String[] listFiles = packFile.list();
for (String fileName : listFiles) {
// 可以采用正则表达式处理
if (fileName.indexOf(tempFileName + "$") > -1 && fileName.endsWith(".class")) {
String newSourceFullFileName = sourcePackPath + "/" + fileName;
String newDesFullFileName = destPackPath + "/" + fileName;
copyFile(newSourceFullFileName, newDesFullFileName);
System.out.println(newSourceFullFileName + "复制完成");
}
}
} } private static void copyFile(String sourceFileNameStr, String desFileNameStr) {
File srcFile = new File(sourceFileNameStr);
File desFile = new File(desFileNameStr);
try {
copyFile(srcFile, desFile);
} catch (IOException e) {
e.printStackTrace();
}
} 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的补丁文件打包生成增量文件的更多相关文章

  1. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

    原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html  之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...

  2. 使用ant自动编译、打包生成apk文件

    上次使用命令行生成apk文件<Android 命令行编译.打包生成apk文件>,学习命令行生成的目的是为了编写ant打下基础. 一. ant环境 下载ant包,配置环境变量 二.ant编译 ...

  3. Android 自动编译、打包生成apk文件 3 - 使用SDK Ant方式

      相关文章列表: < Android 自动编译.打包生成apk文件 1 - 命令行方式> < Android 自动编译.打包生成apk文件 2 - 使用原生Ant方式> &l ...

  4. Android 自动编译、打包生成apk文件 4 - 多渠道批量打包

    相关文章列表: < Android 自动编译.打包生成apk文件 1 - 命令行方式> < Android 自动编译.打包生成apk文件 2 - 使用原生Ant方式 > < ...

  5. java项目打包生成MD5文件

    之所以发出这篇博客,因为我前几天搞这个问题搞了几天,各种百度居然都没有找到相关的案例,虽然很简单的事件.可是百度博客上面居然都搜不到案例o(* ̄︶ ̄*)o觉得奇怪!!! 新总监来了,项目要上线,以前都 ...

  6. Android 自动编译、打包生成apk文件 2 - 使用原生Ant方式

    from://http://blog.csdn.net/androiddevelop/article/details/11100109 相关文章列表: <Android 自动编译.打包生成apk ...

  7. VS2010 打包生成exe文件后 执行安装文件出现 TODO:&lt;文件说明&gt;已停止工作并已关闭

    一.VS2010 打包生成exe文件后  执行安装文件出现  TODO:<文件说明>已停止工作并已关闭 TODO: <文件说明>已停止工作 原因: 打包的时候在文件系统中建立了 ...

  8. 将 Python3 文件打包成 exe 文件

    我们用 Python 写好的代码,如何给别人在没有配置 Python 环境的情况下直接使用呢?尤其是面向 windows 众. 因为 Python 是一门解释性的语言,离开了 Python 解释器,P ...

  9. bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢?

    bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢? 如果用sublime的话如何实现代码保存后浏览器刷新成最新的代码样式? 或者有什么其他好用的工具? 从网上找了很多方法 ...

随机推荐

  1. Vue-admin工作整理(十五):Ajax-跨域问题

    跨域的定义: 解决方法: 1.前端通过配置来解决跨域问题:自定义的vue.config.js配置文件来进行跨域处理:就是只要存在跨域现象 都会代理到一个指定的地址上 devServer: { prox ...

  2. java扫描文件。

    前言:一步一步来实现迷你ioc框架,前面的容器工厂也是一个铺垫,这次的扫描文件也是一个铺垫…… 需求:扫描当前项目下所有文件.包括文件夹下文件夹里面的文件.利用递归进行扫描 ScanFileUtil类 ...

  3. MinTTY终端模拟器要点

    1.MinTTY是一个Cygwin和MSYS的虚拟终端: 2.支持复制和粘贴操作,支持鼠标操作和右键快捷菜单: 3.支持文本.文件.文件夹的拖放: 4.支持中文,支持UTF-8字符集,支持IME(In ...

  4. 《R语言入门与实践》第五章:对象改值

    本章将了如何对一个数据对象中的数据进行改动,分为以下方法: 直接改值 条件取值然后改值 直接改值 单个改值:vec[1] <- 1000多个改值: vec[c(1,3,5)] <- 100 ...

  5. 规则引擎 drools

    https://www.jianshu.com/p/725811f420db 深入了解Drools 简单介绍 笔者正在做风控系统,风控系统里边存在非常多的规则(比如:age < 16 || ag ...

  6. 【转】LVDS基础、原理、图文讲解

    转自:https://blog.csdn.net/wangdapao12138/article/details/79935821 LVDS是一种低摆幅的差分信号技术,它使得信号能在差分PCB 线对或平 ...

  7. 自动车牌识别(ALPR)---https://blog.csdn.net/ELEVEN_ZOU/article/details/80893579

    1.基本功能:从一张或者一系列的图片中提取车牌信息,比如车牌号码.车牌颜色等信息. 2.功能扩展:车型.车品牌.车牌类型等. 3.应用方向:电子交易系统(停车自动收费.收费站自动支付等).交通执法.交 ...

  8. A.CTable 自动创建数据表

    1.添加依赖 <!-- A.CTable 自动创建数据表 --> <dependency> <groupId>com.gitee.sunchenbin.mybati ...

  9. Redis发布订阅方法

    进入redis中 docker run -it redis:latest redis-cli -h 192.168.28.56 (本机的ip地址) 以下实例演示了发布订阅是如何工作的.在我们实例中我们 ...

  10. [linux]关于deepin截图软件在KDE桌面下无法使用粘贴的解决方法

    -------更新----- 1.其实不如直接关闭klipper启动程序 # rm -rf /usr/share/plasma/plasmoids/org.kde.plasma.clipboard 2 ...