- 浏览: 678647 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (141)
- java (58)
- SQL (7)
- java开源 (2)
- javascript (3)
- struts2 (2)
- oracle (6)
- junit (1)
- js报表 (1)
- jQuery (5)
- 插件安装 (1)
- myeclipse (1)
- xfire (1)
- weblogic (1)
- hibernate (6)
- loading (1)
- jbpm (3)
- 物语 (0)
- android (14)
- spring (20)
- BigDecimal (1)
- view (1)
- 总结 (2)
- application (1)
- Netty (5)
- aop (1)
- redis (7)
- double (1)
- restful (1)
- cache (3)
- profile (1)
- redisTemplate (1)
- poi (3)
- excel导出 (1)
- mysql (7)
- group (4)
- replication (4)
- proxysql (1)
- windows (1)
- version (1)
- mongodb (2)
- RocketMQ (1)
- MQ (1)
- RSA (1)
- 日志 (2)
- ip (1)
- socket (1)
- hibernate-validator (1)
- delayQueue (1)
- spring-retry (1)
- rabbitmq (3)
- httpclient (1)
- tools (1)
- 增量发布 (1)
- web (3)
- spring-boot (5)
- druid (2)
- pageHelper (1)
- freemarker (1)
- RequestMapping (1)
- 性能优化 (2)
- springBoot (1)
- docker (2)
- 安全 (0)
- 国际化 (3)
- websocket (1)
- stomp (1)
- shiro (1)
- 网络安全 (2)
- 锁 (1)
- logback (1)
最新评论
-
changerzhuo_319:
谢谢大佬, 查了一天了没解决
Spring-boot构建多模块依赖工程时,maven打包异常:程序包xxx不存在 -
迪伦少校:
spring越来越优秀的同时,也越来越复杂
spring核心技术(1) -
hbxflihua:
ivi13 写道这种方式会有个问题,假如有个商户的交易量特别大 ...
使用spring-retry实现支付系统异步通知 -
ivi13:
这种方式会有个问题,假如有个商户的交易量特别大,通知全部失败, ...
使用spring-retry实现支付系统异步通知 -
ckxlnd:
挺好的 有借鉴意义
重写DispatcherServlet获取springmvc 所有RequestMapping的url
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("打包完成! "); } }
- webpro.rar (55.3 KB)
- 下载次数: 339
评论
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.按时间更新系统,颗粒度太大。。。有可能文件修改了,但不上传服务器的可能。
1.java复制过去的文件日期,不是文件的真正修改日期,可以用dos复制。
2.按时间更新系统,颗粒度太大。。。有可能文件修改了,但不上传服务器的可能。
有道理
8 楼
letran
2012-10-30
有两个问题:
1.java复制过去的文件日期,不是文件的真正修改日期,可以用dos复制。
2.按时间更新系统,颗粒度太大。。。有可能文件修改了,但不上传服务器的可能。
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结合起做。
发表评论
-
Spring Gateway 接口返回值脱敏
2023-10-20 09:55 1996package com.huatech.gateway.f ... -
logback 常用配置及说明
2020-05-28 15:41 710<?xml version="1.0& ... -
springboot中增强druid实现数据库账号密码加解密
2020-03-11 13:31 1557针对目前越来越严的安全等级要求,我们在做产品 ... -
java常用命令
2020-01-14 13:25 1092# 1、查询java进程id jps -v ... -
poi excel导入工具类
2019-11-20 14:00 716poi excel导入工具类ImportUtil i ... -
通过spring-context创建可执行jar
2019-04-23 13:52 11001、新建一个maven工程; 2、pom.xml中 ... -
什么情况下Java程序会产生死锁?如何定位和修复死锁
2019-04-18 20:38 1435死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此 ... -
反射机制和动态代理的原理
2019-04-13 14:02 1995反射机制是Java语言提供的一种基础功能,赋予程序在运行时 ... -
String、StringBuffer、StringBuilder的区别?
2019-04-13 10:00 752Java的基本类型有八种 ... -
强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?
2019-04-12 15:10 753在 Java 语言中,除了原始数据类型的变量,其他 ... -
Exception与Error的区别?
2019-04-11 09:25 562Java语言在设计之初就 ... -
应用国际化(3)
2018-12-27 21:13 829前两篇介绍了应用国际化的注意事项和提示语国际化的简单实现。后 ... -
应用国际化(2)
2018-12-26 20:39 803上一篇介绍了应用国际化需要考虑的问题,本篇介绍后端如何实现 ... -
应用国际化(1)
2018-12-26 20:08 832最近在做数字资产交 ... -
性能优化实战-2
2018-09-28 10:15 1174我们在做架构设计的时候,会提到几个关键词:高性能、高 ... -
性能优化实战-1
2018-09-27 20:04 1115系统优化大致可以分 ... -
rabbitmq批量处理
2018-04-08 17:35 9442我们通过spring-amqp操作rabbitmq是极其简 ... -
java进程CPU过高问题定位
2018-03-14 09:06 22991、top命令查看过高CPU的pid,命令:top ... -
spring-boot集成RabbitMQ
2018-01-16 16:38 1311RabbitMQ的安装不在此赘述,想了解的可以参考: ... -
重写DispatcherServlet获取springmvc 所有RequestMapping的url
2018-01-09 10:41 30581、重写DispatcherServlet i ...
相关推荐
总的来说,"JAVA增量包打包工具"是Java开发中的一款利器,它通过自动化、智能化的方式解决了大型项目更新发布中的痛点,提升了开发效率,优化了用户升级体验。无论是对于个人开发者还是企业团队,都是值得信赖的工具...
* 根据日期文件比较更新,提取更新文件 **/ var fso = new ActiveXObject("Scripting.FileSystemObject"); //工程路径 var webFolder = "C:/Users/Administrator/Desktop/Workspace/syserver/WebRoot"; //类源码...
【svn增量打包小工具】是一种基于Java开发的实用程序,专为IT专业人士设计,用于高效地管理和打包在Subversion(svn)版本控制系统中的代码更改。这个小工具的主要目的是简化版本控制过程,特别是在处理大型项目时,...
`ideploy`就是这样一款专门针对Java Web应用的增量打包工具,它优化了传统的打包流程,提升了开发效率。本文将深入探讨ideploy的功能、工作原理以及如何使用它进行增量打包。 **1. ideploy简介** ideploy是一款专...
增量打包工具是一种在软件开发过程中常用的实用程序,它允许开发者仅对项目中发生变化的部分进行打包,而不是每次都重新打包整个项目。这种工具极大地提高了工作效率,减少了不必要的资源消耗,尤其是在大型项目或者...
Java增量升级工具是一种...总之,Java增量升级工具是Java开发中的一个强大助手,它通过智能分析和打包技术,简化了更新流程,提升了更新效率。了解并熟练掌握这种工具,对于提升软件项目的质量和用户体验具有重要意义。
增量打包工具patch-generator-desk-v2.0.0是一款针对IT项目,特别是Web应用程序的高效自动化打包解决方案。这款工具旨在简化版本更新过程,通过只打包自上次发布以来更改过的文件,显著减少部署包的大小,从而提高...
增量打包工具会比较当前目录与上一次打包时的差异,只包含新创建、修改过的文件,而忽略未改变的文件。这种功能在持续集成或版本控制的场景中尤为重要,因为它允许用户快速获取到项目的最新变化,而不必下载整个项目...
路径扫描,日期扫描,文件过滤,备注填报,多线程处理速度快, 避免了繁琐的手动打包过程...
java 写的根据svn信息生成的增量打包工具类,有部分路径和判断条件需要修改,修改正确后可直接执行main方法运行。
Java增量升级程序是一种高效的方法,用于更新已部署的Java应用程序,仅包含自上次发布以来更改的文件。在软件开发过程中,尤其是大型项目,频繁的版本迭代是常态,每次全量打包和分发可能会浪费大量的时间和资源。...
java项目增量更新之Eclipse外部工具 增量更新根据Eclipse里当前选中文件或目录自动获取class文件或resource文件打包到相应的路径目录里 修复BUG: 1、项目存在多个src路径的时候读取不到class文件 2、java文件有内部...
1:根据svn提交记录选择需要打增量包的文件进行增量,特别提醒:打包前请使用开发工具对项目进行编译,因为打包是拷贝开发工具编译后的class文件。 2:模拟http请求,主要用于接口调。详情使用说明参见本人csdn博客...
在增量更新场景下,NDK可以用于编译和打包那些需要进行更新的原生库或代码片段。 JNI(Java Native Interface)是Java平台的一个标准接口,它允许Java代码和其他语言写的代码进行交互。在Android应用的增量更新过程...
https://blog.csdn.net/zou_hailin226/article/details/82836328 我已经将描述写成教程,需要的下载
增量更新的基本原理是只将自上次发布以来修改过的代码部分打包成一个新的jar包。这样,用户只需要下载这个较小的增量jar包,并将其与现有应用中的旧jar包合并,就能实现应用的更新。这个过程通常涉及到版本控制系统...
该工具利用了SVNKit库来与Subversion(SVN)版本控制系统交互,通过对SVN日志(log)的分析,识别出自上次发布以来的变更,从而生成仅包含这些增量更新的发布包。这种方式显著减少了部署时的数据传输量,提高了发布...
Ant是一个广泛使用的Java项目构建工具,通过XML配置文件定义任务和依赖关系,实现自动化编译、打包、测试等一系列工作。将Cobertura与Ant结合,开发者可以在执行Ant构建时轻松地添加测试覆盖率检查,无需额外的复杂...