文档章节

如何实现SVN导出某段时间修改过的文件;自动将class文件部署到服务器中;重启服务器

BeGit
 BeGit
发布于 2017/03/16 17:20
字数 1666
阅读 303
收藏 0

一:如何实现SVN导出某段时间修改过的文件

有时候修改代码需要增量部署,只替换某段时间修改过的文件,改代码时记录也行,问题是你能保证不遗漏,保证头不晕,还喜欢重复这种动作吗,部署服务器你也知道部错一个文件得来回启,来回找?那怎么做比较好呢?其实用SVN是可以导出自己某段时间自己修改过的文件的,只需要java简单处理就能得到文件路径了。(其实要进一步的话,可以让这种增量部署自动化也是有可能的)希望也能分享您的方法。

步骤:

1.右键整个项目根,用SVN显示资源历史记录,会发现会显示所有开发者提交的记录信息。默认应该是按时间逆序排列的。

2.然后点击查找历史进入条件匹配。

3.查询条件包括作者,注释,起止日期,版本号等,比如我按提交者账号是“gongxinglin”的账号查询&&按提交日期是17-3-1至17-3-16期间日期的。

4.确定查询后得到的结果就都是该账号的记录了。

5.全选所有你需要的日志记录右键就会提示导出svn相关的日志记录了。

6.导出的文件格式默认名称是:changeLog.txt

7.发现文件格式还是比较有规律的,然后用java读取处理就可能得到不重复的文件路径了。

下面是一个测试的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("执行完毕。");
    }
}
 

 

© 著作权归作者所有

BeGit
粉丝 20
博文 93
码字总数 71312
作品 0
顺义
后端工程师
私信 提问
Puppet系列之三:Puppet结合SVN实现版本的集中化备份与恢复

1 概述 通过安装部署Puppet C/S模型,实现Puppet Server端管理所有被控制机的整个生命周期:从初始化到软件升级、从配置文件创建到测试部署、从系统维护到服务器迁移等。Puppet能够持续化的与...

guzhoujiexing
2018/06/26
0
0
SVN环境搭建for windows

SVN(subversion)是近年来崛起的版本管理工具,是CVS的接班人。目前,绝大多数开源软件都使用SVN作为代码版本管理软件。其在版本控制、团队协作方面的重要性在此不必多说。本文主要对如何在W...

城邑耕夫
2011/08/22
1K
1
如何在Mac环境下搭建svn服务器端环境

在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还需做一下简...

lwaif
2015/07/15
89
0
jenkins和docker实现自动化构建部署

应用场景 程序员开发应用,开发后需要提交svn,然后从svn拉取代码,进行构建,发布到tomcat中,发布,然后看呈现效果,这样的工作是频繁反复的在进行的,浪费了程序员的大量时间,那么能不能...

wsc449
2017/12/06
0
0
Android studio 下的svn配置使用

一、Android Studio配置SVN Android Studio关联配置SVN很简单,在Settings里面,找到Version Control->Subversion;在这个页面的控制面板中的General中将Use command line client打勾勾选上,...

让代码飞一会
2015/11/05
4.5K
5

没有更多内容

加载失败,请刷新页面

加载更多

sync.Mutex 互斥锁

说明: 互斥锁用来保证在任一时刻,只能有一个例程访问某对象。Mutex 的初始值为解锁状态。Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。Mutex 可...

李琼涛
14分钟前
5
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
17分钟前
3
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
18分钟前
4
0
事假杨晨龙(Z16021)月薪请假单

svn co URL --username xxx-- password yyy ./

桃花飞舞
42分钟前
4
0
当Activity关闭后,网络请求回调的处理

当我们在使用网络请求的时候,一般都是通过回调来获取请求到的数据。对于网络请求的回调需要注意的几个点 比如我们的回调在Activity中处理数据,当我们把Activity关闭后,如果获取到数据时,...

shzwork
43分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部