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.List;public class FreePatchUtil { public static String projectPath = "E:/work/work_spaces/api/src/main/webapp"; //maven web项目的webapp目录 public static String classPath = "E:/work/work_spaces/api/target/classes"; //maven 项目编译后的classes目录 public static String patchFile = "F:/api.patch"; //升级补丁描述文件路径 public static String desPath = "F:/path"; //打包后升级包补丁包存放目录 public static String version = "20140711"; //补丁版本号 /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { copyFiles(getPatchFileList()); } /** * 分析svn补丁文件 * @return * @throws Exception */ public static List getPatchFileList() throws Exception { List fileList=new ArrayList (); FileInputStream f = new FileInputStream(patchFile); BufferedReader dr = new BufferedReader(new InputStreamReader(f,"utf-8")); String line; while((line=dr.readLine())!=null) { //eclipse svn create path 创建的补丁包信息 if(line.indexOf("Index:")!=-1) { line=line.replaceAll(" ",""); line=line.substring(line.indexOf(":")+1,line.length()); fileList.add(line); } //如果是文件夹, 则跳过 else if(line.indexOf(".") == -1) { continue; } //TortoiseSVN show log 复制的补丁包信息 else if(line.startsWith("/api/")) { line = line.substring("/api/".length()); fileList.add(line); } } return fileList; } /** * 根据不同资源, 拷贝到补丁包的不同路径 * @param list */ public static void copyFiles(List list) { for(String fullFileName:list) { //复制classes文件 if(fullFileName.indexOf("src/main/java") != -1) { String fileName = fullFileName.replace("src/main/java", ""); fullFileName = classPath + fileName; if(fileName.endsWith(".java")) { fileName = fileName.replace(".java",".class"); fullFileName = fullFileName.replace(".java",".class"); } String desFilePathStr = desPath + "/" + version + "/WEB-INF/classes" + fileName.substring(0, fileName.lastIndexOf("/")); 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+"复制完成"); } //复制资源配置文件 else if(fullFileName.indexOf("src/main/resources") != -1) { String fileName = fullFileName.replace("src/main/resources", ""); fullFileName = classPath + fileName; String desFilePathStr = desPath + "/" + version + "/WEB-INF/classes" + fileName.substring(0, fileName.lastIndexOf("/")); 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+"复制完成"); } //复制web资源 else if (fullFileName.indexOf("src/main/webapp") != -1) { String fileName = fullFileName.replace("src/main/webapp", ""); fullFileName = projectPath + fileName; String desFilePathStr = desPath + "/" + version + fileName.substring(0, fileName.lastIndexOf("/")); String desFileNameStr = desPath + "/" + version + fileName; File desFilePath=new File(desFilePathStr); if(!desFilePath.exists()) { desFilePath.mkdirs(); } copyFile(fullFileName, desFileNameStr); System.out.println(fullFileName+"复制完成"); } } } 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(); } } }