IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    summer发表于 2016-07-14 03:32:12
    love 0

    唯一一个被人点了推荐的是Python脚本,嗯,果然还是应该发点现成的脚本工具么?

     

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

    人在外包公司,规模不大,规范啥的不谈了,完全没有

    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创建的项目文件目录结构不同)
    #

    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自自动遍历相关内部类,如果有则一起复制 ClassNamexxx.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("WebContent/")):
    # WebContent资源转换
    srcfile = srcpath + data[0][10:len(data[0])]
    desfile
    = despath + data[0][10:len(data[0])]
    if(myCopyFile(srcfile,desfile)):
    log
    = addLog(log,"[已处理][版本号:"+str(data[1])+"]"+data[0])
    else:
    print(srcfile)
    log
    = addLog(log,"[未处理][版本号:"+str(data[1])+"]中的文件["+data[0]+"]不存在!")
    elif(data[0].startswith("src/")):
    # SRC路径转换
    if (data[0].endswith("java")):
    tmp
    = data[0][3:len(data[0])-4]+"class"
    else:
    tmp
    = data[0][3:len(data[0])]
    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" + data[0][6:len(data[0])]
    desfile
    = despath + "/WEB-INF/classes" + data[0][6:len(data[0])]
    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()



沪ICP备19023445号-2号
友情链接