`

根据SVN信息自动生成升级补丁包

    博客分类:
  • Java
阅读更多

很早以前写过的一个应用,翻出来看看,估计以后还是大有用处的,怕弄丢了,毕竟写这个代码还是花了不少脑细胞的,就再整理整理了

 

 

直接贴代码了:

/**
 * 使用说明:
 * 注意:在使用之前需保证本地和SVN上的数据保持一致。
 * 
 * 使用方法:
 * 1. 查看SVN日志,将日志复制到一个文本文件 war.txt 中
 * 2. 配置参数,需对以下几个参数进行配置:(对于目录路径可以不用斜杠结尾)
 *    destPath:  生成的打包文件夹。
 *    workPath:  服务器下部署目录。
 * 3. 执行完成之后,查看日志 log/fatwar.log 如果没有任何异常且没有错误提示信息(在最后),则表示执行成功。
 *    如果执行成功,那么在日志中最后会提示生成的打包地址。
 */
public class FatWarMain
{
    private final static Logger log = LogManager.getLogger(FatWarMain.class);
    
    public static String destPath = null; // 放生成的WAR路径
    public static String txtPath = "war.txt"; // 将SVN信息复制到该文本文件中
    public static String workPath = null; // 注意此目录需配置为服务器目录,eclipse工作目录可能不存在JSP文件
    
    public static void main(String[] args)
    {
        setResourceAttributeValue();
        if (workPath == null || "".equals(workPath))
        {
            log.info("请配置参数,参数值不能为空!");
            return;
        }
        if (!new File(workPath).exists())
        {
            log.info("指定服务器部署目录不存在,请检查路径是否正确!");
            return;
        }
        log.info("destPath:" + destPath + " workPath:" + workPath);
        StringBuffer errinfo = new StringBuffer();
        BufferedReader reader = null;
        try
        {
            reader = new BufferedReader(new FileReader(txtPath));
            String string = null;
            while ((string = reader.readLine()) != null)
            {
                log.info("SVN信息:" + string);
                if (string.contains("/ProductCode/"))
                {
                    String filename = string.substring(string.lastIndexOf('/') + 1);
                    log.info("获取文件名:" + filename);
                    if (filename.endsWith(".java")) // 编译之后生成class文件,且要考虑内部类的情况
                    {
                        final String temp = filename.substring(0, filename.indexOf(".java")); // 去掉扩展名之后的文件名
                        String classDir = workPath + "/WEB-INF/classes" + string.substring(string.indexOf("/ProductCode/") + 12, string.lastIndexOf('/'));
                        final String destDir = destPath + "/WEB-INF/classes" + string.substring(string.indexOf("/ProductCode/") + 12, string.lastIndexOf('/'));
                        File[] files = new File(classDir).listFiles(new FileFilter() {

                            public boolean accept(File file)
                            {
                                if (file.getName().equals(temp + ".class") || file.getName().startsWith(temp + "$"))
                                {
                                    String dest = destDir + "/" + file.getName();
                                    log.info("原文件路径:" + file.getPath());
                                    log.info("目标文件路径:" + dest);
                                    Handle.copyFile(file, new File(dest));
                                    return true;
                                }
                                return false;
                            }});
                        if (files.length == 0)
                        {
                            log.warn("在路径 " + classDir + " 下找不到编译之后的文件,源文件名:" + filename);
                            errinfo.append("SVN信息:" + string + "\n在路径 " + classDir + " 下找不到编译之后的文件,源文件名:" + filename + "\n");
                        }
                        log.info("该SVN信息处理完成!\n");
                    }
                    else // 对于其他类型文件
                    {
                        String sourceFile = workPath + "/WEB-INF/classes" + string.substring(string.indexOf("/ProductCode/") + 12);
                        String destFile = destPath + "/WEB-INF/classes" + string.substring(string.indexOf("/ProductCode/") + 12);
                        log.info("原文件路径:" + sourceFile);
                        log.info("目标文件路径:" + destFile);
                        Handle.copyFile(new File(sourceFile), new File(destFile));
                        log.info("该SVN信息处理完成!\n");
                    }
                }
                else if (string.contains("/WebContent/"))
                {
                    String sourceFile = workPath + string.substring(string.indexOf("/WebContent/") + 11);
                    String destFile = destPath + string.substring(string.indexOf("/WebContent/") + 11);
                    log.info("原文件路径:" + sourceFile);
                    log.info("目标文件路径:" + destFile);
                    Handle.copyFile(new File(sourceFile), new File(destFile));
                    log.info("该SVN信息处理完成!\n");
                }
                else if (string.trim().length() > 0)
                {
                    log.warn("该SVN信息不能被解析!\n");
                    errinfo.append("\nSVN信息:" + string + "\n该SVN信息不能被解析!\n");
                }
            }
            String errorinfostr = errinfo.toString();
            if (errorinfostr.length() > 0)
            {
                log.error("\n以下是错误信息:\n" +
                        "-------------------------------------------------------------------------------------------------------------------------" +
                        errorinfostr);
            }
            else
            {
                log.info("运行成功,打包地址:" + destPath);
            }
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (reader != null)
                {
                    reader.close();
                }
            }
            catch (IOException e)
            {
            }
        }
    }

    public static void setResourceAttributeValue()
    {
        BufferedReader reader = null;
        String string = "";
        try
        {
            reader = new BufferedReader(new FileReader("config/res.txt"));
            boolean b = false;
            while ((string = reader.readLine()) != null)
            {
                String key = string.substring(0, string.indexOf('='));
                String value = string.substring(string.indexOf('=') + 1).trim();
                if (key.equals("destPath"))
                {
                    FatWarMain.destPath = value;
                    b = true;
                }
                if (key.equals("workPath"))
                {
                    FatWarMain.workPath = value;
                }
            }
            if (!b)
            {
                FatWarMain.destPath = String.valueOf(new Date().getTime());
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (reader != null)
                {
                    reader.close();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

 

public class Handle
{

    /**
     * 拷贝文件
     * @param source 原文件
     * @param dest   目标文件
     */
    public static void copyFile(File source, File dest)
    {
        FileInputStream inputStream = null;
        FileOutputStream outputStream = null;
        try
        {
            if (!dest.exists())
            {
                dest.getParentFile().mkdirs();
            }
            inputStream = new FileInputStream(source);
            outputStream = new FileOutputStream(dest);
            byte[] bs = new byte[8192];
			int size = 0;
			while ((size = inputStream.read(bs)) != -1)
			{
				outputStream.write(bs, 0, size);
			}
            outputStream.flush();
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (outputStream != null)
                {
                    outputStream.close();
                }
            }
            catch (IOException e)
            {
            }
            try
            {
                if (inputStream != null)
                {
                    inputStream.close();
                }
            }
            catch (IOException e)
            {
            }
        }
    }

}

 项目里面还得配个LOG4J

# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=info, file, stdout

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%p] %m%n

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
# log4j.appender.logfile.MaxBackupIndex=10
# log4j.appender.logfile.MaxFileSize=102400KB
log4j.appender.file.File=log/fatwar.log
log4j.appender.file.append=false
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d [%p] %m%n

 

分享到:
评论
2 楼 daijiejun 2011-03-29  
牛X 牛B!!
1 楼 zhangzhenting 2010-09-14  
提交的jar包不会自动生成到更新包中去。

相关推荐

    根据SVN日志自动生成补丁

    标题 "根据SVN日志自动生成补丁" 描述了一个基于SVNKit的自动化工具,该工具能够分析SVN(Subversion)的日志,找出在版本控制中的改动,然后将这些改动打包成升级补丁,并生成相应的更新日志。这个过程在软件开发中...

    java web项目自动打补丁包 web工程项目 自动化 补丁包

    总结来说,这个Java Web项目的自动打补丁包流程利用了Maven进行项目构建,通过bat脚本启动自动化,使用SVN记录版本变化,而Python脚本则负责解析日志并智能地更新指定文件。这种自动化方法大大提高了开发效率,降低...

    web补丁自动生成工具

    很多童鞋可能也遇到有很多小web项目,每个项目上线前需要制作升级补丁,用ant太麻烦,配置错误的话,很容易造成打包时漏打文件,本工具结合SVN管理,将SVN变化日志复制出来,粘贴到工具中,即可生成上线补丁,这个是...

    JAVA增量包打包工具

    通过增量打包生成的补丁包,可以方便地发布到服务器或者应用市场,用户只需下载较小的更新包即可完成升级,极大地优化了更新流程,减少了因大文件下载而导致的失败概率。 7. **提高迭代速度**: 使用这样的工具,...

    补丁制作工具2006121321324995.rar

    1. **补丁概念**:补丁是软件升级的一种形式,主要用来修正程序中的错误、安全漏洞或者添加新功能。它们通常比完整版的软件小,下载和应用起来更快捷。 2. **补丁类型**:补丁可以分为安全补丁、功能补丁和性能优化...

    patchdiff2.010b.zip

    7. **软件发布**:在软件发布过程中,开发团队会利用patchdiff这样的工具来创建补丁包,供用户下载。这样可以减少下载大小,提高更新速度。 8. **开源社区**:在开源项目中,patchdiff常用于提交代码更改,开发者...

    PLSQL Developer 12 (32位)+官方汉化包+注册码

    - **报表生成**:自动生成代码报告或数据库结构文档,便于理解和维护。 - **版本控制集成**:支持与常见的版本控制系统如Git、SVN等集成,便于版本管理和代码同步。 2. **汉化包**: 汉化包是为了方便中文用户...

    Advanced_Installer_Architect_15.9_Portable_Downloadly.ir.rar

    6. 生成安装包,可以选择MSI或EXE格式,还可以生成自动更新和补丁文件。 7. 测试安装程序,确保一切正常。 总结,Advanced Installer Architect 15.9 Portable是一款面向Delphi开发者的专业安装包制作工具,其强大...

    MyEclipse9.1M2汉化包

    这个"MyEclipse9.1M2汉化包"是针对MyEclipse9.1M2版本的一个本地化补丁,目的是将原本英文界面转化为中文,以便于中文用户更加方便地使用这款软件。描述中提到它同样适用于MyEclipse10,意味着这个汉化包具有一定的...

    PLSQL Developer10.0.3.1701简体中文(附注册机)

    6. **自动升级**:描述中提到,该软件具有自动升级功能,这意味着用户可以轻松获取到最新的补丁和功能,保持软件的最新状态。 7. **数据库连接**:可以配置多个数据库连接,便于在不同的数据库实例间切换工作。 8....

    plsql8工具

    8. **报表和文档生成**:可以自动生成PL/SQL代码的文档,便于理解和维护,也可以生成数据库对象的报表,为审计和汇报提供便利。 9. **自动化脚本**:用户可以编写和运行自定义的PL/SQL脚本,实现日常数据库管理任务...

    buildpatch-master.zip

    它可能包含一系列自动化脚本和工具,用于从源代码构建补丁文件,这些文件可以被用户安装以升级或修复他们的系统。 4. **Master分支**:在版本控制系统(如Git)中,"master"通常代表主分支,包含项目的主要、稳定或...

    测试个人简历 .docx

    6. **版本控制**: 熟练使用SVN进行文档管理和VSS进行版本控制。 7. **操作系统**: 熟练掌握Linux文本模式和图形模式操作系统,并熟悉常用的Linux命令。 8. **测试管理工具**: 熟悉QC、Bugfree、TAPD等测试管理工具,...

    redmine-4.1.1.zip

    - **报告生成**:根据项目数据生成各种报告,如工时报告、进度报告等。 5. **插件与定制** - **社区插件**:Redmine有丰富的社区插件,可扩展其功能,如Gantt chart viewer、时间跟踪器增强等。 - **主题定制**...

    PLSQL Developer11.0.0.1762简体中文(附注册机)

    - **自动升级**: 软件能够自动检查并更新到最新版本,确保用户始终使用到最新的功能和补丁。 3. **汉化版的使用**: PLSQL Developer 11.0.0.1762_CHS.exe是该软件的简体中文版本,对于中文用户来说,界面更加友好...

    plsql developer v11.0.2.1766

    它还能自动生成各种数据库对象的代码,如存储过程、函数、触发器和包。 2. **数据库对象管理**:用户可以轻松浏览和管理数据库中的所有对象,如表、视图、索引、同义词、序列、簇等。工具还支持对象的创建、修改和...

    PL.SQL.Developer.v8.0.4.1514.rar

    这个版本可能包含了安装程序、帮助文档、更新日志以及可能的补丁或升级文件。 在PL/SQL Developer中,用户可以进行以下主要操作: 1. **代码编辑**:提供代码高亮、自动完成、语法检查等特性,提升编程效率。 2. **...

    plsql7 oracle客户端开发工具

    在下载的压缩包"plsql7正式版"中,通常包含了PL/SQL Developer 7的安装程序、许可证文件以及可能的升级补丁和用户手册。安装完成后,用户即可开始使用上述功能进行Oracle数据库的开发和管理工作。由于PL/SQL ...

    Git权威指南PDF完整版

    30.1.2 Gitolite 的安装/升级/ 415 30.1.3 关于 SSH 主机别名/ 417 30.1.4 其他的安装方法/ 418 30.2 管理 Gitolite/ 419 30.2.1 管理员克隆 gitolite-admin 管理库/ 419 30.2.2 增加新用户/ 420 30.2.3 更改授权/ ...

Global site tag (gtag.js) - Google Analytics