DeltaRelease--Java Web增量发布工具(附源码)

  DeltaRelease,Java Web 增量发布工具,又称增量更新打包工具,是指在Java Web应用程序用来发布补丁包的一种工具。因增量发布具有风险小,更新速度快等优势,在企业Java Web应用发布补丁时所广泛使用。本着有福同享的奉献精神,小编将这款好用的工具免费送给大家。


    Java Web增量发布工具的源码已经发布到GitHub,有需要的小伙伴们可以猛击这里查看。

    

    1.publish_config.xml配置文件,配置补丁文件的源位置及发布位置

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <apps default="favsoft" patchFolder="d:/favsoft/patchFolder">
        <app appName="deltaRelease" patchFile="deltaReleaseFile.txt">
            <patch_source_dir>
                E:\work\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\webapps\DeltaRelease
            </patch_source_dir>
            <patch_dest_dir>
                /opt/apache-tomcat-7.0.28/webapps/DeltaRelease
            </patch_dest_dir>
        </app>
    </apps>
</config>


    2.PublishService.java,发布服务类,获取编译好的补丁文件,发布到目标位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package com.favccxx.favsoft.deltarelease;
 
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
 
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
public class PublishService {
     
    private static Logger logger = LogManager.getLogger(PublishService.class.getName());
     
    public static void getDeltaReleaseFiles(){
         
        String sourceFolder = SystemConfig.getInstance().getString("apps[@default]");
        String patchFolder = SystemConfig.getInstance().getString("apps[@patchFolder]");
        try {
            //清理输出文件目录
            File file = new File(patchFolder);
            if(file.exists()){
                FileUtils.cleanDirectory(new File(patchFolder));
            }
            FileUtils.forceMkdir(new File(patchFolder));
        catch (IOException e) {
            logger.error("Error get File, The wrong file path is:" + patchFolder);
            logger.error("Error Message is:" + e.getMessage());
        }
         
        //取出最新的class列表
        List<HierarchicalConfiguration> appList = SystemConfig.getInstance().configurationsAt("apps.app");
        for (Iterator<HierarchicalConfiguration> iterator = appList.iterator(); iterator.hasNext();) {
            HierarchicalConfiguration hierarchicalConfiguration = iterator.next();
            String appName = hierarchicalConfiguration.getString("[@appName]");
            String patchFilePath = hierarchicalConfiguration.getString("[@patchFile]");
            String patch_source_dir = hierarchicalConfiguration.getString("patch_source_dir");
            String patch_dest_dir = hierarchicalConfiguration.getString("patch_dest_dir");
            String destDir = patchFolder + patch_dest_dir;
            //执行拷贝补丁文件
            copyPatchFile(appName,patch_source_dir,patchFilePath,destDir);         
        }
         
         
    }
     
     
    private static void copyPatchFile(String appName,String sourceDir, String patchFilePath, String destDir){
        logger.info("******************************开始拷贝"+ appName +"工程的补丁文件**************************");
        try {
            //创建生成补丁文件的目录
            FileUtils.forceMkdir(new File(destDir));
        catch (IOException e) {
            logger.error("Error get destDir,The wrong path is:" + destDir);
            logger.error("Error Message is:" + e.getMessage());
        }
             
            File patchFile = new File(Thread.currentThread().getContextClassLoader().getResource(PublishConstants.SYSTEM_CONFIG_DIR+patchFilePath).getFile());  //读取补丁文件--deltaReleaseFile.txt
            try {
                List fileLines = FileUtils.readLines(patchFile);
                int count=0;
                for (Iterator iterator = fileLines.iterator(); iterator.hasNext();) {
                    String fileName = (String) iterator.next();
                    if(StringUtils.isNotEmpty(fileName)){
                        if(fileName.endsWith("java")){
                            //java补丁文件,需找到对应的class
                            fileName = fileName.replaceAll(".java"".class");
                            String sourceFilePath = sourceDir + "\\WEB-INF\\classes" + fileName;
                            File compileFile = new File(sourceFilePath);
                            if(compileFile.exists()){
                                String destFilePath = destDir + "\\WEB-INF\\classes" + fileName;
                                FileUtils.copyFile(compileFile, new File(destFilePath));
                                logger.info("-------" + ++count +"成功拷贝补丁文件到:" + destFilePath);
                            }else{
                                logger.error("未找到该补丁文件,错误的路径:" + sourceFilePath);
                            }
                             
                        }else{
                            //JSP、CSS、JS等格式的文件直接copy到工程的目录
                            String sourceFilePath = sourceDir + fileName;
                            String destFilePath = destDir + fileName;
                            FileUtils.copyFile(new File(sourceFilePath), new File(destFilePath));   
                            logger.info("-------" + ++count +"成功拷贝补丁文件到:" + destFilePath);
                        }
                    }
                }
                logger.info("******************************"+ appName +"工程补丁文件获取成功,共拷贝"+ count +"个补丁文件**************************");
            catch (IOException e) {
                logger.error("Error in execute copyPatchFile. The wrong message is:" + e.getMessage());
            }
             
    }
 
}

    3.增量发布日志

DeltaRelease--Java Web增量发布工具(附源码)






本文转自 genuinecx 51CTO博客,原文链接:http://blog.51cto.com/favccxx/1430935,如需转载请自行联系原作者