pppploi8's Blog

欢迎来到pppploi8的个人博客!

[Python3]JavaEE项目更新包打包工具

首先说下这东西的制作环境

在单位JavaWeb项目部署后要更新代码每次都要自己看修改了什么文件,手动复制变更文件到服务器单独替换,特别是改了一堆BUG涉及到各种Java,JSP文件十几二十几个的时候…手动从Tomcat里找复制编译好的class相当痛苦

然而并没有现成的工具…于是乎想了想就自己手写了个脚本负责自动打包

单位项目主要是Eclipse+SVN,SVN是使用的sqlite3作为本地数据存储来存储文件变更列表,那么利用SVN就可以很方便的快速获取文件更新信息了

鉴于不同的IDE对应的项目文件结构不一样,这个脚本也只能用在相同环境(Eclipse+SVN)的应用上

用法很简单,按提示输入SVN项目目录/打包起始版本号/Tomcat应用目录/生成差异目录,就会自动读取SVN对应版本号开始到最后一个版本为止的所有文件变动信息,并且去Tomcat找到对应文件(class/jsp等等),复制到生成差异目录的对应位置内,最后只需要备份下原应用,然后整个文件夹粘贴替换重启就算完成更新了

没学过Python随便瞎写写的,变量名啊规范啥的就无视吧….

import sqlite3
import traceback
import os
import os.path
from shutil import copy

#
# 这个工具的作用是根据SVN的文件变更记录,自动去Tomcat目录复制变更class方便制作更新包
# 只支持Eclipse项目(不同IDE创建的项目文件目录结构不同)
#

prePath = "cms/" # 路径前缀,用于一个SVN下有多个项目的前提下,只处理符合前缀的文件

def addLog(oldlog,logtext):
    print(logtext)
    return oldlog+"\n"+logtext
def getDirByPath(dirpath):
    return dirpath[0:dirpath.rindex("/")]
def getFilenameByPath(dirpath):
    return dirpath[dirpath.rindex("/")+1:len(dirpath)]
def myCopyFile(c_srcfile,c_desfile):
    if (os.path.exists(c_srcfile) == False):
        return False
    if (os.path.exists(getDirByPath(c_desfile)) == False):
        os.makedirs(getDirByPath(c_desfile))
    # 如果是class自自动遍历相关内部类,如果有则一起复制 ClassName$xxx.class 格式文件
    tmpfile = getFilenameByPath(c_srcfile)
    if (tmpfile.endswith(".class")):
        tmpdir = getDirByPath(c_srcfile)
        tmpfile = tmpfile[0:len(tmpfile)-6] + "$"
        for d in os.listdir(tmpdir):
            if(d.startswith(tmpfile)):
                copy(tmpdir+"/"+d,getDirByPath(c_desfile)+"/"+d)
    copy(c_srcfile,c_desfile)
    return True

print("欢迎使用SVN差异自动打包脚本,以下要求输入路径末尾均无\\符号")
print("本脚本只适用于Eclipse的Java EE项目")
print("内部类会全部复制,如有需要请手动删除多余内部类")
path = input("请输入SVN项目目录:")
try:
    cx = sqlite3.connect(path + "\\.svn\\wc.db")
    cu = cx.cursor()
    ver = input("请输入打包版本号:")
    cu.execute("select local_relpath,changed_revision from NODES where kind='file' and changed_revision>=" + ver + " order by changed_revision")
    srcpath = input("请输入Tomcat项目文件夹:")
    despath = input("请输入差异文件保存位置:")
    log = ""
    log = addLog(log,"[开始处理差异文件,从版本"+ver+"]开始:")
    while(True):
        data = cu.fetchone()
        if (data == None):
            break
        # 判断前缀路径决定是否处理
        if (data[0].startswith(prePath)):
            tmpPath = data[0][len(prePath):len(data[0])]
            # 根据扩展名判断转换路径
            if (tmpPath.startswith("WebContent/")):
                # WebContent资源转换
                srcfile = srcpath + tmpPath[10:len(tmpPath)]
                desfile = despath + tmpPath[10:len(tmpPath)]
                if(myCopyFile(srcfile,desfile)):
                    log = addLog(log,"[已处理][版本号:"+str(data[1])+"]"+data[0])
                else:
                    log = addLog(log,"[未处理][版本号:"+str(data[1])+"]中的文件["+data[0]+"]不存在!")
            elif(tmpPath.startswith("WebRoot/")):
                srcfile = srcpath + tmpPath[7:len(tmpPath)]
                desfile = despath + tmpPath[7:len(tmpPath)]
                if(myCopyFile(srcfile,desfile)):
                    log = addLog(log,"[已处理][版本号:"+str(data[1])+"]"+data[0])
                else:
                    log = addLog(log,"[未处理][版本号:"+str(data[1])+"]中的文件["+data[0]+"]不存在!")
            elif(tmpPath.startswith("src/")):
                # SRC路径转换
                if (data[0].endswith("java")):
                    tmp = tmpPath[3:len(tmpPath)-4]+"class"
                else:
                    tmp = tmpPath[3:len(tmpPath)]
                tmp = "/WEB-INF/classes" + tmp
                srcfile = srcpath + tmp
                desfile = despath + tmp
                if(myCopyFile(srcfile,desfile)):
                    log = addLog(log,"[已处理][版本号:"+str(data[1])+"]"+data[0])
                else:
                    log = addLog(log,"[未处理][版本号:"+str(data[1])+"]中的文件["+data[0]+"]不存在!")
            elif(data[0].startswith("config/")):
                # config路径转换
                srcfile = srcpath + "/WEB-INF/classes" + tmpPath[6:len(tmpPath)]
                desfile = despath + "/WEB-INF/classes" + tmpPath[6:len(tmpPath)]
                if(myCopyFile(srcfile,desfile)):
                    log = addLog(log,"[已处理][版本号:"+str(data[1])+"]"+data[0])
                else:
                    log = addLog(log,"[未处理][版本号:"+str(data[1])+"]中的文件["+data[0]+"]不存在!")
            else:
                # 其他资源写日志暂不处理
                log = addLog(log,"[未处理][版本号:"+str(data[1])+"]中的文件["+data[0]+"]无法识别,请手动处理!")
    file_object = open(despath + "/chuli.log", 'w')
    file_object.write(log)
    file_object.close()
    print("程序执行完毕,日志已写到["+srcpath+"\\chuli.log],请根据需要查阅手动处理[未处理]项目")
except:
    print("程序执行异常")
    traceback.print_exc()