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

时间:2022-03-10 02:58:14

唯一一个被人点了推荐的是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创建的项目文件目录结构不同)
#

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()