`
hbxflihua
  • 浏览: 678659 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java增量更新打包工具

    博客分类:
  • java
 
阅读更多

Java程序增量更新是一个吃力不讨好的工作,浪费了时间不说,还很容易出现漏掉文件、错放文件位置等问题。如果有一个比较好的管理机制,把这些事情交给程序自动处理就省事的多了。

工具尚不成熟,不过用起来比手动去选择增量文件要方便的多。下面就直接上代码了。

工具包括三个工具类,一个配置文件,一个程序启动类,具体如下:

 

文件工具类

package cn.lihua.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

/**
 * 文件管理工具类
 * @author lihua
 * @version V1.0
 * @createDate 2012-10-27
 */
public class FileUtil {
	/**  
     * 复制文件  
     *   
     * @param srcFile  
     *            源文件File  
     * @param destDir  
     *            目标目录File  
     * @param newFileName  
     *            新文件名  
     * @return 实际复制的字节数,如果文件、目录不存在、文件为null或者发生IO异常,返回-1  
     */  
    public static long copyFile1(File srcFile, File destDir, String newFileName) {   
        long copySizes = 0;   
        if (!srcFile.exists()) {   
            System.out.println("源文件不存在");   
            copySizes = -1;   
        } else if (!destDir.exists()) {   
            System.out.println("目标目录不存在");   
            copySizes = -1;   
        } else if (newFileName == null) {   
            System.out.println("文件名为null");   
            copySizes = -1;   
        } else {   
            try {   
                BufferedInputStream bin = new BufferedInputStream(   
                        new FileInputStream(srcFile));   
                BufferedOutputStream bout = new BufferedOutputStream(   
                        new FileOutputStream(new File(destDir, newFileName)));   
                int b = 0, i = 0;   
                while ((b = bin.read()) != -1) {   
                    bout.write(b);   
                    i++;   
                }   
                bout.flush();   
                bin.close();   
                bout.close();   
                copySizes = i;   
  
            } catch (FileNotFoundException e) {   
                e.printStackTrace();   
            } catch (IOException e) {   
                e.printStackTrace();   
            }   
        }   
        return copySizes;   
    }   
  
    /**  
     * 复制文件(以超快的速度复制文件)  
     *   
     * @param srcFile  
     *            源文件File  
     * @param destDir  
     *            目标目录File  
     * @param newFileName  
     *            新文件名  
     * @return 实际复制的字节数,如果文件、目录不存在、文件为null或者发生IO异常,返回-1  
     */  
    public static long copyFile2(File srcFile, File destDir) {   
        long copySizes = 0;   
        if (!srcFile.exists()) {   
            System.out.println("源文件不存在");   
            return -1;   
        }
        try {   
            FileChannel fcin = new FileInputStream(srcFile).getChannel();   
            FileChannel fcout = new FileOutputStream(destDir).getChannel();   
            long size = fcin.size();   
            fcin.transferTo(0, fcin.size(), fcout);   
            fcin.close();   
            fcout.close();   
            copySizes = size;   
        } catch (FileNotFoundException e) {   
            e.printStackTrace();   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
        
        return copySizes;   
    } 
    
    
    public static void copyDict(File source, File target,long last,String target_pack) {   
        File[] file = source.listFiles();
        for (int i = 0; i < file.length; i++) {   
        	if(file[i].getName().contains("svn")){
        		continue;
        	}        	
            if (file[i].isFile()) {
            	if(file[i].lastModified()>=last){
            		if((file[i].getName().endsWith(".hbm.xml")||file[i].getName().endsWith(".class"))&&
            			notEmpty(target_pack)&&!source.getAbsolutePath().contains(target_pack)){
            			continue;
            		}
            		System.out.println(source.getAbsolutePath());
            		File sourceDemo = new File(source.getAbsolutePath() + "/"  
            				+ file[i].getName());   
            		File destDemo = new File(target.getAbsolutePath() + "/"  
            				+ file[i].getName());   
            		copyFile2(sourceDemo, destDemo);               		
            	}
            }   
            if (file[i].isDirectory()) {
            	
                File sourceDemo = new File(source.getAbsolutePath() + "/"  
                        + file[i].getName());   
                File destDemo = new File(target.getAbsolutePath() + "/"  
                        + file[i].getName());   
                destDemo.mkdir();
                copyDict(sourceDemo, destDemo,last,target_pack);   
            }   
        }  
        
    }   
    
    public static boolean notEmpty(String str) {
    	return str!=null&&!str.isEmpty();
	}
    /**  
     * 循环删除空的文件夹    
     * @param dir  
     */  
    public static void deleteEmptyDir(File dir) {   
    	 
        if (dir.isDirectory()) {   
            File[] fs = dir.listFiles();   
            if (fs != null && fs.length > 0) {   
                for (int i = 0; i < fs.length; i++) {   
                    File tmpFile = fs[i];   
                    if (tmpFile.isDirectory()) {   
                        deleteEmptyDir(tmpFile);   
                    }   
                    if (tmpFile.isDirectory() && tmpFile.listFiles().length <= 0) {   
                        tmpFile.delete();   
                    }   
                   
                }   
            }   
            if (dir.isDirectory() && dir.listFiles().length == 0) {   
                dir.delete();   
            }           
          
        }   
    } 
    
    public static void main(String[] args) {
		String [] s = "127.0.0.1 - - [14/Sep/2012:11:27:10 +0800] POST /newkyhb/sys/loginlognews.action HTTP/1.1 200 356 0.032".split(" ");
		for (String string : s) {
			System.out.println(string);
		}
    	
	}

}

 

Properties文件工具类

package cn.lihua.util;

import java.io.InputStream;
import java.util.Properties;

/**
 * Properties 文件读写工具类
 * @author lihua
 * @version V1.0
 * @createDate 2012-10-27
 */
public class PropertiesUtil {
	//private static final Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);
	private static final Properties prop = loadPropertiesFile("setting.properties");

	private static Properties loadPropertiesFile(String filePath) {
		InputStream in;
		try {
			in = PropertiesUtil.class.getClassLoader().getResourceAsStream(filePath);
			Properties p = new Properties();
			p.load(in);
			return p;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static String getString(String key) {
		if (prop != null)
			return prop.getProperty(key);
		return null;
	}
}

 

 

工程目录工具类

package cn.lihua.util;
import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;


/**
 * 工程根目录工具类
 * @author lihua
 * @version V1.0
 * @createDate 2012-9-13
 */
public class WebRootUtil {

	private static Document doc = null;
	
	/**
	 * 初始化操作
	 * @param xmlFile
	 * @throws Exception
	 */
	public static void init(String xmlFile) throws Exception {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		doc = db.parse(new File(xmlFile));
	}
	
	/**
	 * 获取.mymetadata中的web root folder 名称
	 * @param xmlFile
	 * @return
	 * @throws Exception
	 */
	public static String getRootName(String xmlFile) throws Exception {
		String webRoot = "WebRoot";
		init(xmlFile);
		NodeList nodeList = doc.getElementsByTagName("attribute");
		for (int i = 0, len = nodeList.getLength(); i < len; i++) {
			Element attribute = (Element) nodeList.item(i);
			if ("webrootdir".equals(attribute.getAttribute("name"))){
				webRoot = attribute.getAttribute("value");
				break;
			}
		}

		return webRoot;
	}
	
	public static void main(String[] args)throws Exception {		
		System.out.println(getRootName("D:\\workspace\\newkyhb\\.mymetadata"));
	}
}

 

Properties配置文件

#\u4E0A\u4F20\u6587\u4EF6\u5B58\u653E\u8DEF\u5F84
source_path=D\:\\workspace\\newkyhb
target_path=D\:\\update_version
update_date=2012-09-13
target_pack=\\jsp

 

 

 

 

启动类

package cn.lihua;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import cn.lihua.util.FileUtil;
import cn.lihua.util.PropertiesUtil;
import cn.lihua.util.WebRootUtil;
/**
 * 启动入口类
 * @author lihua
 * @version V1.0
 * @createDate 2012-10-27
 */
public class Startup {

	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	
	
	private static long packed_date;//修改文件起始时间
	private static String source_path;//原工程目录
	private static String target_path;//打包目录
	private static String target_pack;//class打包包名
	private static String project_new_name;//新打包工程名称
	private static String meta_data_file =".mymetadata";//根目录配置文件
	private static String root_name;//拷贝根目录
	
	
	/**
	 * 初始化操作
	 * @throws Exception
	 */
	private static  void init()throws Exception{
		String update_date =PropertiesUtil.getString("update_date");		
		packed_date = sdf.parse(update_date).getTime();
		source_path =PropertiesUtil.getString("source_path");
		String project_name = source_path.substring(source_path.lastIndexOf("\\")+1);//原工程名
		project_new_name = project_name + "(" + sdf.format(new Date()) + ")";
		root_name = WebRootUtil.getRootName(source_path + File.separator + meta_data_file);		
		target_pack =PropertiesUtil.getString("target_pack");
		target_path =PropertiesUtil.getString("target_path");
		File target = new File(target_path + File.separator + project_new_name);		
		if(!target.exists()){
			target.mkdirs();
		}	
	}
	
	/**
	 * 执行拷贝任务
	 */
	public static void copy(){
		
		/**
		 * 拷贝文件及文件夹
		 */
		FileUtil.copyDict(
				new File(source_path + File.separator + root_name), 
				new File(target_path + File.separator + project_new_name), 
				packed_date,target_pack);
		/**
		 * 删除空文件夹
		 */
		FileUtil.deleteEmptyDir(
				new File(target_path + File.separator + project_new_name));
	}
	
	/**
	 * 程序入口
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args)throws Exception {
		System.out.println("======================================");
		System.out.println("正在进行初始化操作……");
		init();
		System.out.println("======================================");
		System.out.println("拷贝的源文件目录如下:");
		copy();		
		System.out.println("======================================");
		System.out.println("打包完成! ");
	}
	
	
	
	
	
}

 

 

 

2
0
分享到:
评论
11 楼 sun_mingtao 2015-08-23  
updiff 是一个增量更新(升级)的工具,支持备份、更新、异常恢复功能。依据 Git 两个提交版本号提取差异文件进行更新操作。 http://git.oschina.net/soenter/updiff
10 楼 hbxflihua 2012-10-31  
xuliuliu 写道
可以做成图形化窗口吗

可以的,有两种方式可以做:
一、将工程打成jar包,用bat文件做启动文件。
二、用java swing
9 楼 hbxflihua 2012-10-31  
letran 写道
有两个问题:
1.java复制过去的文件日期,不是文件的真正修改日期,可以用dos复制。
2.按时间更新系统,颗粒度太大。。。有可能文件修改了,但不上传服务器的可能。

有道理
8 楼 letran 2012-10-30  
有两个问题:
1.java复制过去的文件日期,不是文件的真正修改日期,可以用dos复制。
2.按时间更新系统,颗粒度太大。。。有可能文件修改了,但不上传服务器的可能。
7 楼 qq506623761 2012-10-30  
牛人,学习下
6 楼 yzhw 2012-10-30  
5 楼 x521 2012-10-30  
这个想法不错,如果图形化操作更好点
4 楼 xuliuliu 2012-10-30  
可以做成图形化窗口吗
3 楼 xuliuliu 2012-10-30  
号样的
2 楼 pywepe 2012-10-27  
关于FileUtil,请参考commons-io中的FileUtils和IOUtils
1 楼 XXlXXyXXlXX 2012-10-27  
学习了,最近也想做一个这样的工具,打算跟SVN结合起做。

相关推荐

    JAVA增量包打包工具

    总的来说,"JAVA增量包打包工具"是Java开发中的一款利器,它通过自动化、智能化的方式解决了大型项目更新发布中的痛点,提升了开发效率,优化了用户升级体验。无论是对于个人开发者还是企业团队,都是值得信赖的工具...

    java增量更新打包JS脚本工具

    * 根据日期文件比较更新,提取更新文件 **/ var fso = new ActiveXObject("Scripting.FileSystemObject"); //工程路径 var webFolder = "C:/Users/Administrator/Desktop/Workspace/syserver/WebRoot"; //类源码...

    svn增量打包小工具

    【svn增量打包小工具】是一种基于Java开发的实用程序,专为IT专业人士设计,用于高效地管理和打包在Subversion(svn)版本控制系统中的代码更改。这个小工具的主要目的是简化版本控制过程,特别是在处理大型项目时,...

    ideploy 打包工具javaweb 增量打包工具

    `ideploy`就是这样一款专门针对Java Web应用的增量打包工具,它优化了传统的打包流程,提升了开发效率。本文将深入探讨ideploy的功能、工作原理以及如何使用它进行增量打包。 **1. ideploy简介** ideploy是一款专...

    增量打包工具

    增量打包工具是一种在软件开发过程中常用的实用程序,它允许开发者仅对项目中发生变化的部分进行打包,而不是每次都重新打包整个项目。这种工具极大地提高了工作效率,减少了不必要的资源消耗,尤其是在大型项目或者...

    java增量升级工具

    Java增量升级工具是一种...总之,Java增量升级工具是Java开发中的一个强大助手,它通过智能分析和打包技术,简化了更新流程,提升了更新效率。了解并熟练掌握这种工具,对于提升软件项目的质量和用户体验具有重要意义。

    增量打包工具 patch-generator-desk-v2.0.0

    增量打包工具patch-generator-desk-v2.0.0是一款针对IT项目,特别是Web应用程序的高效自动化打包解决方案。这款工具旨在简化版本更新过程,通过只打包自上次发布以来更改过的文件,显著减少部署包的大小,从而提高...

    简单易用的文件打包增量工具

    增量打包工具会比较当前目录与上一次打包时的差异,只包含新创建、修改过的文件,而忽略未改变的文件。这种功能在持续集成或版本控制的场景中尤为重要,因为它允许用户快速获取到项目的最新变化,而不必下载整个项目...

    java工程增量包 打包工具 非常强大,非常好用

    路径扫描,日期扫描,文件过滤,备注填报,多线程处理速度快, 避免了繁琐的手动打包过程...

    java 写的根据svn信息生成的增量打包

    java 写的根据svn信息生成的增量打包工具类,有部分路径和判断条件需要修改,修改正确后可直接执行main方法运行。

    java增量升级程序.zip

    Java增量升级程序是一种高效的方法,用于更新已部署的Java应用程序,仅包含自上次发布以来更改的文件。在软件开发过程中,尤其是大型项目,频繁的版本迭代是常态,每次全量打包和分发可能会浪费大量的时间和资源。...

    java项目增量更新之Eclipse外部工具(修改版)

    java项目增量更新之Eclipse外部工具 增量更新根据Eclipse里当前选中文件或目录自动获取class文件或resource文件打包到相应的路径目录里 修复BUG: 1、项目存在多个src路径的时候读取不到class文件 2、java文件有内部...

    java开发的可视化打增量包、发http请求、生成ibatis辅助工具

    1:根据svn提交记录选择需要打增量包的文件进行增量,特别提醒:打包前请使用开发工具对项目进行编译,因为打包是拷贝开发工具编译后的class文件。 2:模拟http请求,主要用于接口调。详情使用说明参见本人csdn博客...

    android增量更新.zip

    在增量更新场景下,NDK可以用于编译和打包那些需要进行更新的原生库或代码片段。 JNI(Java Native Interface)是Java平台的一个标准接口,它允许Java代码和其他语言写的代码进行交互。在Android应用的增量更新过程...

    Java打增量补丁包工具

    https://blog.csdn.net/zou_hailin226/article/details/82836328 我已经将描述写成教程,需要的下载

    增量更新jar包

    增量更新的基本原理是只将自上次发布以来修改过的代码部分打包成一个新的jar包。这样,用户只需要下载这个较小的增量jar包,并将其与现有应用中的旧jar包合并,就能实现应用的更新。这个过程通常涉及到版本控制系统...

    javaweb工程自动增量发布小工具

    该工具利用了SVNKit库来与Subversion(SVN)版本控制系统交互,通过对SVN日志(log)的分析,识别出自上次发布以来的变更,从而生成仅包含这些增量更新的发布包。这种方式显著减少了部署时的数据传输量,提高了发布...

    Java测试覆盖率工具cobertura1.9

    Ant是一个广泛使用的Java项目构建工具,通过XML配置文件定义任务和依赖关系,实现自动化编译、打包、测试等一系列工作。将Cobertura与Ant结合,开发者可以在执行Ant构建时轻松地添加测试覆盖率检查,无需额外的复杂...

Global site tag (gtag.js) - Google Analytics