一:如何實現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("執行完畢。"); } }