[Python]JavaEE項目更新包打包工具,pythonjavaee
唯一一個被人點了推薦的是Python指令碼,嗯,果然還是應該發點現成的指令碼工具嗎?
首先說下這東西的製作環境
人在外包公司,規模不大,規範啥的不談了,完全沒有
JavaWeb項目部署後要更新代碼每次都要自己看修改了什麼檔案,手動複製變更檔案到伺服器單獨替換,特別是改了一堆BUG涉及到各種Java,JSP檔案十幾二十幾個的時候...手動從Tomcat裡找複製編譯好的class相當痛苦
然而也說了,沒規範更沒現成的工具...於是乎想了想就自己手寫了個指令碼負責自動打包
單位項目主要是Eclipse+SVN,SVN是使用的sqlite3作為本機資料儲存來隱藏檔變更列表,那麼利用SVN就可以很方便的快速擷取檔案更新資訊了
鑒於不同的IDE對應的專案檔結構不一樣,這個指令碼也只能用在相同環境(Eclipse+SVN)的應用上
用法很簡單,按提示輸入SVN項目目錄/打包起始版本號碼/Tomcat應用目錄/產生差異目錄,就會自動讀取SVN對應版本號碼開始到最後一個版本為止的所有檔案變動資訊,並且去Tomcat找到對應檔案(class/jsp等等),複製到產生差異目錄的對應位置內,最後只需要備份下原應用,然後整個檔案夾粘貼替換重啟就算完成更新了
沒學過Python隨便瞎寫寫的,變數名啊規範啥的就無視吧....
import sqlite3import tracebackimport osimport os.pathfrom shutil import copy## 這個工具的作用是根據SVN的檔案變更記錄,自動去Tomcat目錄複寫變更class方便製作更新包# 只支援Eclipse項目(不同IDE建立的專案檔目錄結構不同)#def addLog(oldlog,logtext): print(logtext) return oldlog+"\n"+logtextdef 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 Trueprint("歡迎使用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()