如何實現SVN導出某段時間修改過的文件;自動將class文件部署到服務器中;重啓服務器

一:如何實現SVN導出某段時間修改過的文件java

有時候修改代碼須要增量部署,只替換某段時間修改過的文件,改代碼時記錄也行,問題是你能保證不遺漏,保證頭不暈,還喜歡重複這種動做嗎,部署服務器你也知道部錯一個文件得來回啓,來回找?那怎麼作比較好呢?其實用SVN是能夠導出本身某段時間本身修改過的文件的,只須要java簡單處理就能獲得文件路徑了。(其實要進一步的話,可讓這種增量部署自動化也是有可能的)但願也能分享您的方法。linux

步驟:windows

1.右鍵整個項目根,用SVN顯示資源歷史記錄,會發現會顯示全部開發者提交的記錄信息。默認應該是按時間逆序排列的。服務器

2.而後點擊查找歷史進入條件匹配。app

3.查詢條件包括做者,註釋,起止日期,版本號等,好比我按提交者帳號是「gongxinglin」的帳號查詢&&按提交日期是17-3-1至17-3-16期間日期的。jsp

4.肯定查詢後獲得的結果就都是該帳號的記錄了。svn

5.全選全部你須要的日誌記錄右鍵就會提示導出svn相關的日誌記錄了。oop

6.導出的文件格式默認名稱是:changeLog.txt測試

7.發現文件格式仍是比較有規律的,而後用java讀取處理就可能獲得不重複的文件路徑了。spa

下面是一個測試的java:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashSet;
import java.util.Set;


public class svn_log_test {
    public static void main(String[] agrs){
        Set<String> pathSet = new HashSet<String>();
        try {
            String changeLogPath = "d://changeLog.txt";
            FileReader reader = new FileReader(changeLogPath);
            BufferedReader br = new BufferedReader(reader);
            String str = null;
            StringBuffer sb= new StringBuffer();
            while((str = br.readLine()) != null) {
                  sb.append(str+"/n");
                  System.out.println(str);
                  if(str.indexOf("M /") > 0){
                      pathSet.add(str);
                  }
            }
            br.close();
            reader.close();
            }catch (Exception e) {
                System.out.println(e);
            }
            System.out.println("影響的路徑集合是:");
            for(String path : pathSet){
                System.out.println(path);
            }
    }
}
下面是實際使用的java類:支持排除某些用戶的重複文件

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;


public class svn_log_test {
    /**
     * 1.由svn路徑找到要部署的jsp和class文件。
     * 2.按部署的目錄結構複製須要部署替換的文件。
     * 3.其餘文件按照原來的目錄結構進行組織處理,其實除了java文件外,其餘應該均可以按其餘文件處理。
     * 使用時直接拖拽整個目錄到對應的路徑便可。
     * 
     * @param agrs
     */
    public static void main(String[] agrs){
            String excluChangeLogPath = "d://auto_class_file/changeLog_mjl.txt";//排出的svn日誌信息
            Set<String> exclupathSet = getSvnLogPathSet(excluChangeLogPath);
            
            String changeLogPath = "d://auto_class_file/changeLog.txt";
            Set<String> finalPathSet = new HashSet<String>();//最終文件集合
            Set<String> pathSet = getSvnLogPathSet(changeLogPath);
            System.out.println("原文件數:"+pathSet.size());
            Iterator<String> pathIt = pathSet.iterator();  
            while (pathIt.hasNext()) {  
              String path = pathIt.next();  
              if(exclupathSet.contains(path)){
                  System.out.println("排除的衝突文件:"+path);
              }
              finalPathSet.add(path);
            }  
            System.out.println("排除後文件數:"+finalPathSet.size());
            extractClassFile(finalPathSet);
    }
    
    public static Set<String> getSvnLogPathSet(String changeLogPath){
        Set<String> pathSet = new HashSet<String>();
        try {
            FileReader reader = new FileReader(changeLogPath);
            BufferedReader br = new BufferedReader(reader);
            String str = null;
            while((str = br.readLine()) != null) {
                  if(str.indexOf("M /") > 0){
                      pathSet.add(str);
                  }
            }
            br.close();
            reader.close();
        }catch (Exception e) {
            System.out.println(e);
        }
        return pathSet;
    }
    
    
    public static final String deployDestPath = "d:/auto_class_file/";//部署目錄
    
    public static final String PROJECT_ROOT = "C:/VenusTools2010/workspace/BOSP_2v2";//項目根路徑
    public static final String svnRoot = "M /trunk/bosp_3";//svn公共路徑
    
    public static final String classPath = PROJECT_ROOT +"/bosp/WEB-INF/classes/";//class文件起始目錄
    
    public static final String svn_classPath = svnRoot +"/src/";//解析svn文件java路徑
    public static void extractClassFile(Set<String> pathSet){
        String projectRoot = "bosp";//項目root名稱
        int copyFileNum = 0;//處理文件數
        int copyClassFileNum = 0;
        
        int otherFileNum = 0;
        for(String path : pathSet){
            if(path.indexOf(svn_classPath) > -1){
                String destPath = classPath + path.replaceAll(svn_classPath, "").replaceAll("java", "class").trim();//class文件
                if(null != destPath && destPath.length() > 0){
                    File classFile = new File(destPath);
                    if(classFile.exists()){
                        String classFileName = classFile.getName().replaceAll(".class", "");
                        File parentFile = classFile.getParentFile();
                        if(parentFile.exists() && parentFile.isDirectory()){
                            File[] fileList = parentFile.listFiles();
                            if(null != fileList && fileList.length > 0){
                                for(File fileTemp :fileList){
                                    if(fileTemp.getName().indexOf(classFileName) > -1){
                                        //找到全部的class文件及class相關的內部類文件
                                        //複製到指定目錄
                                        String toClassFile = deployDestPath + fileTemp.getAbsolutePath().substring(fileTemp.getAbsolutePath().indexOf(projectRoot));
                                        copyFileNum++;
                                        System.out.println(copyFileNum +"*"+fileTemp.getName().substring(fileTemp.getName().lastIndexOf(".")));
                                        copyFile(new File(toClassFile),fileTemp);
                                        copyClassFileNum ++;
                                    }
                                }
                            }
                        }
                    }
                }
            }else{
                path = path.replaceAll(svnRoot, "").trim();
                String destPath = PROJECT_ROOT  + path;
                File otherFile = new File(destPath);
                if(otherFile.exists()){
                    String toOtherFile = null;
                    if(otherFile.getAbsolutePath().indexOf("WEB-INF") > -1){
                        //放到classes目錄下
                        toOtherFile = deployDestPath + projectRoot + File.separator +  otherFile.getAbsolutePath().substring(otherFile.getAbsolutePath().indexOf("WEB-INF"));//TODO  到指定目錄。
                    }else{
                        toOtherFile = deployDestPath + projectRoot + File.separator +  otherFile.getAbsolutePath().substring(otherFile.getAbsolutePath().indexOf(projectRoot));//TODO  到指定目錄。
                    }
                    copyFile(new File(toOtherFile),otherFile);
                    copyFileNum ++;
                    otherFileNum ++;
                }
                System.out.println("*其餘文件:"+path);
            }
        }
        System.out.println("執行完畢。總源文件數:"+pathSet.size()+"    部署的class文件數:"+copyClassFileNum+"     部署的其餘文件數:"+otherFileNum + "     部署的文件總數:"+copyFileNum);
    }
    /**
     * 覆蓋複製文件到指定目錄
     * @param toFile
     * @param fromFile
     */
    public static void copyFile(File toFile, File fromFile) {
        createFile(toFile, true);
        System.out.println("複製文件" + fromFile.getAbsolutePath() + "到"
                + toFile.getAbsolutePath());
        try {
            InputStream is = new FileInputStream(fromFile);
            FileOutputStream fos = new FileOutputStream(toFile);
            byte[] buffer = new byte[1024];
            while (is.read(buffer) != -1) {
                fos.write(buffer);
            }
            is.close();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 建立複製的文件目錄或文件
     * @param file
     * @param isFile
     */
    public static void createFile(File file, boolean isFile) {
        if ((!file.exists()) && (isFile)) {
            if (!file.getParentFile().exists()){
                file.getParentFile().mkdirs();
            }
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
二:將整理後的class增量文件上傳到服務器指定目錄。

若是使用pscp上傳文件是比較方便的,下面封裝了相應的自動上傳方法:

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;


public class pscp_test {

    /**      * @param args      */     public static void main(String[] args) {         //上傳        /* String localFilePath = "D:/auto_class_file/changeLog.txt";//上傳的文件路徑         String remoteDestAbsPath = "/root";//linux文件目標目標絕對路徑         uploadFile(localFilePath,remoteDestAbsPath);*/         //下載         String remoteFilePath = "/root/hadoop-2.7.3.tar.gz";         String fileType = "";         String localPath = "D:/auto_class_file/";         getFile(remoteFilePath,fileType,localPath);     }    /**      * 上傳windows本地文件或目錄(已支持目錄)      *      * @param localFilePath     * @param remoteDestAbsPath     */     public static void uploadFile(String localFilePath,String remoteDestAbsPath){         if(null != localFilePath && null != remoteDestAbsPath){             File localFile = new File(localFilePath);             String pscpPath = "D:/auto_class_file/pscp.exe";//pscp.exe命令路徑             String commandStr = null;             if(localFile.exists()){                 if(localFile.isFile()){                     commandStr = "cmd.exe /k start  && "+pscpPath+" -pw admin "+localFilePath+" root@192.168.56.100:"+remoteDestAbsPath;                 }else{                     commandStr = "cmd.exe /k start  && "+pscpPath+" -pw admin -r "+localFilePath+" root@192.168.56.100:"+remoteDestAbsPath;                 }                 execCommand(commandStr);             }         }     }     /**      * 下載遠程服務器文件      * @param remoteFilePath      * @param fileType      * @param localPath      */     public static void getFile(String remoteFilePath,String fileType,String localPath){         if(null != remoteFilePath && null != localPath){             File localFile = new File(localPath);             String pscpPath = "D:/auto_class_file/pscp.exe";//pscp.exe命令路徑             String commandStr = null;             if(localFile.exists()){                 if(localFile.isDirectory()){                     if(fileType.equals("d")){                         commandStr = "cmd.exe /k start  && "+pscpPath+" -pw admin -r  root@192.168.56.100:"+remoteFilePath+" "+localPath;                     }else{                         commandStr = "cmd.exe /k start  && "+pscpPath+" -pw admin  root@192.168.56.100:"+remoteFilePath+" "+localPath;                     }                     execCommand(commandStr);                 }else{                     System.out.println("本地路徑爲非目錄。");                 }             }         }     }          //執行命令     public static void execCommand(String commandStr){         if(null != commandStr && commandStr.length() > 0){             try {                 Runtime run = Runtime.getRuntime();                      Process process = run.exec(commandStr);                   InputStream input = process.getInputStream();                    BufferedReader reader = new BufferedReader(new InputStreamReader(input));                   String szline;                   while ((szline = reader.readLine()) != null) {                          System.out.println(szline);                      }                      reader.close();                      process.waitFor();                    process.destroy();                 } catch (Exception e) {                               e.printStackTrace();                  }          }         System.out.println("執行完畢。");     } }  

相關文章
相關標籤/搜索