修改tomcat部署下,專案配置(涉及properties,xml,zip,war之間相互轉換修改)
阿新 • • 發佈:2018-12-30
思路:傳入tomcat部署路徑,
1,遍歷tomcat下所有的資料夾,因為要修改
的檔案都是固定,所以根據傳入路徑就能拼裝要修改的檔案。
2,像1的解決思路,可能導致tomcat不斷在啟動,因為檔案在修改。
所以又想到,將要修改的war包改成Zip,因為其結構都一樣,Zip不會
自動部署,其他修改都一樣。修改完後將zip字尾名改為war即可。
注意解壓目錄需要更換一個其他目錄,不要直接解壓到部署目錄下。
遇到的問題:
在修改檔案時,一邊讀一邊寫,寫的時候總是取不到檔案,
除非在斷點的情況下,手動執行一下,後面才能取到,我想
這可能是java在節約記憶體,不能同時用到兩個流在一個檔案操作。
想到的解決方法是,先寫到一個零時檔案,然後再將這個零時檔案
複製到原檔案,再將零時檔案刪除。
在解壓檔案完成壓縮後需要將解壓後的檔案刪除,這時遇到到了一個
檔案不能刪除的情況,通過網上的查詢,找到一種gc回收機制,能解決。
下面給出關鍵程式碼:
複製檔案: private void copyFile(File fromFile,File toFile) throws IOException{ FileInputStream ins = new FileInputStream(fromFile); FileOutputStream out = new FileOutputStream(toFile); byte[] b = new byte[1024]; int n=0; while((n=ins.read(b))!=-1){ out.write(b, 0, n); } ins.close(); out.close(); fromFile.delete(); } 修改properties檔案 @SuppressWarnings("unused") private void updateWeixin4jProperties(String path,String weChatappId,String weChatappSecret, String weChattoken,String weChatAESKey,String weixin4jaccount){ String fileName=path+"/WEB-INF/classes/weixin4j.properties"; String fileName1=path+"/WEB-INF/classes/weixin4jCopy.properties"; File file = new File(fileName); if(file.exists()){ BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); File file1 = new File(fileName1); if(file1.exists()){ file1.createNewFile(); } FileWriter out=new FileWriter (file1); BufferedWriter bw= new BufferedWriter(out); String tempString = null; // int line = 1; // 一次讀入一行,直到讀入null為檔案結束 while ((tempString = reader.readLine()) != null) { if(tempString.startsWith("weChat.appId=")){ tempString="weChat.appId="+weChatappId; bw.write(tempString); bw.newLine(); }else if (tempString.startsWith("weChat.appSecret=")) { tempString="weChat.appSecret="+weChatappSecret; bw.write(tempString); bw.newLine(); } else if (tempString.startsWith("weChat.AESKey=")) { tempString="weChat.AESKey="+weChatAESKey; bw.write(tempString); bw.newLine(); } else if (tempString.startsWith("weixin4j.account=")) { tempString="weixin4j.account="+weixin4jaccount; bw.write(tempString); bw.newLine(); } else{ bw.write(tempString); bw.newLine(); } } reader.close(); bw.flush(); bw.close(); out.close(); copyFile(file1,file); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } } 修改xml檔案 @SuppressWarnings({"rawtypes", "unused"}) private void updateWebXml(String path,String casinneraddress, String casiloginaddress, String applicationmatchaddress, String applicationinneraddress,String statementserviceaddress){ String fileName=path+"/WEB-INF/web.xml"; File file = new File(fileName); SAXReader reader1 = new SAXReader(); if(file.exists()){ try { Document document = reader1.read(new FileReader(file)); // 通過document物件獲取根節點rootStore Element rootStore = document.getRootElement(); // 通過element物件的elementIterator方法獲取迭代器 Iterator it = rootStore.elementIterator(); // 遍歷迭代器,獲取根節點中的資訊 int secondflag=0; String thridflag=""; while (it.hasNext()) { // System.out.println("=====開始遍歷一節點====="); Element first = (Element) it.next(); // 獲取book的屬性名以及 屬性值 // System.out.println("一級節點名:" + first.getName() + "--一級節點值:" + first.getStringValue()); Iterator itt = first.elementIterator(); while (itt.hasNext()) { Element second = (Element) itt.next(); // System.out.println("二級節點名:" +second.getName() + "--二級節點值:" + second.getStringValue()); if(second.getStringValue().equals("CAS Single Sign Out Filter") && first.getName().equals("filter")){ secondflag=1; }else if(second.getStringValue().equals("CAS Validation Filter") && first.getName().equals("filter")){ secondflag=2; }else if(second.getStringValue().equals("CAS Authentication Filter") && first.getName().equals("filter")){ secondflag=3; }else if(second.getStringValue().equals("ProxyServlet") && first.getName().equals("servlet")){ secondflag=4; } Iterator ittt= second.elementIterator(); while(ittt.hasNext()){ Element third= (Element)ittt.next(); // System.out.println("三級節點名:" + third.getName() + "--三級節點值:" + third.getStringValue()); if(third.getName().equals("param-value") && secondflag==1 && first.getName().equals("filter")){ if(!CheckUtil.isNullorEmpty(casinneraddress)){ third.setText(casinneraddress); } secondflag=0; }else if(third.getName().equals("param-name") && first.getName().equals("filter")){ thridflag=third.getStringValue(); }else if(third.getName().equals("param-value") && secondflag==2 && first.getName().equals("filter") && thridflag.equals("casServerUrlPrefix")){ if(!CheckUtil.isNullorEmpty(casinneraddress)){ third.setText(casinneraddress); } thridflag=""; }else if(third.getName().equals("param-value") && secondflag==2 && first.getName().equals("filter") && thridflag.equals("serverName")){ if(!CheckUtil.isNullorEmpty(applicationmatchaddress)){ third.setText(applicationmatchaddress); } thridflag=""; }else if(third.getName().equals("param-value") && secondflag==2 && first.getName().equals("filter") && thridflag.equals("proxyCallbackUrl")){ if(!CheckUtil.isNullorEmpty(applicationinneraddress)){ third.setText(applicationinneraddress+"mainWeb/proxyCallback"); } thridflag=""; } else if(third.getName().equals("param-value") && secondflag==3 && first.getName().equals("filter") && thridflag.equals("casServerLoginUrl")){ if(!CheckUtil.isNullorEmpty(casiloginaddress)){ third.setText(casiloginaddress); } thridflag=""; } else if(third.getName().equals("param-value") && secondflag==3 && first.getName().equals("filter") && thridflag.equals("serverName")){ if(!CheckUtil.isNullorEmpty(applicationmatchaddress)){ third.setText(applicationmatchaddress); } thridflag=""; } ///servlet else if(third.getName().equals("param-name") && first.getName().equals("servlet")){ thridflag=third.getStringValue(); } else if(third.getName().equals("param-value") && secondflag==4 && first.getName().equals("servlet") && thridflag.equals("url")){ if(!CheckUtil.isNullorEmpty(statementserviceaddress)){ third.setText(statementserviceaddress); } thridflag=""; } }// while(ittt.hasNext()) }//while (itt.hasNext()) thridflag=""; secondflag=0; } OutputFormat format=OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); XMLWriter writer=new XMLWriter(new FileOutputStream(fileName),format); writer.write(document); writer.close(); }catch (Exception e) { e.printStackTrace(); } } } /** * 解壓壓縮包 * * @param zipFilePath 壓縮檔案路徑帶字尾名 * @param destDir 解壓目錄 */ @SuppressWarnings("rawtypes") private void unZip(String zipFilePath, String destDir) { //destDir=destDir+"/"; destDir=destDir+File.separator; ZipFile zipFile = null; try { BufferedInputStream bis = null; FileOutputStream fos = null; BufferedOutputStream bos = null; zipFile = new ZipFile(zipFilePath); Enumeration zipEntries = zipFile.entries(); File file, parentFile; ZipEntry entry; byte[] cache = new byte[CACHE_SIZE]; while (zipEntries.hasMoreElements()) { entry = (ZipEntry) zipEntries.nextElement(); if (entry.isDirectory()) { new File(destDir + entry.getName()).mkdirs(); continue; } bis = new BufferedInputStream(zipFile.getInputStream(entry)); file = new File(destDir + entry.getName()); parentFile = file.getParentFile(); if (parentFile != null && (!parentFile.exists())) { parentFile.mkdirs(); } fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos, CACHE_SIZE); int readIndex = 0; while ((readIndex = bis.read(cache, 0, CACHE_SIZE)) != -1) { fos.write(cache, 0, readIndex); } bos.flush(); bos.close(); fos.close(); bis.close(); } } catch (IOException e) { e.printStackTrace(); } finally { try { zipFile.close(); } catch (IOException e) { e.printStackTrace(); } } } 壓縮檔案: /** * * @param destFile 帶字尾名 * @param zipDir 資料夾名 */ private void zipWar(String destFile, String zipDir) { File outFile = new File(destFile); try { outFile.createNewFile(); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(outFile)); ArchiveOutputStream out = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.JAR, bufferedOutputStream); if (zipDir.charAt(zipDir.length() - 1) != '/') { zipDir += '/'; } Iterator<File> files = FileUtils.iterateFiles(new File(zipDir), null, true); while (files.hasNext()) { File file = files.next(); ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file, file.getPath().replace( zipDir.replace("/", "\\"), "")); out.putArchiveEntry(zipArchiveEntry); IOUtils.copy(new FileInputStream(file), out); out.closeArchiveEntry(); } out.finish(); out.close(); bufferedOutputStream.close(); System.gc(); } catch (IOException e) { System.err.println("建立檔案失敗"); e.printStackTrace(); } catch (ArchiveException e) { e.printStackTrace(); System.err.println("不支援的壓縮格式"); } } /** * 刪除目錄及目錄下的檔案 * * @param dir * 要刪除的目錄的檔案路徑 * @return 目錄刪除成功返回true,否則返回false * @throws Exception */ public static boolean deleteDirectory(String dir) throws Exception { // 如果dir不以檔案分隔符結尾,自動新增檔案分隔符 if (!dir.endsWith(File.separator)) dir = dir + File.separator; File dirFile = new File(dir); // 如果dir對應的檔案不存在,或者不是一個目錄,則退出 if ((!dirFile.exists()) || (!dirFile.isDirectory())) { System.out.println("刪除目錄失敗:" + dir + "不存在!"); return false; } boolean flag = true; // 刪除資料夾中的所有檔案包括子目錄 File[] files = dirFile.listFiles(); for (int i = 0; i < files.length; i++) { // 刪除子檔案 if (files[i].isFile()) { flag = deleteFile(files[i].getAbsolutePath()); if (!flag) break; } // 刪除子目錄 else if (files[i].isDirectory()) { flag =deleteDirectory(files[i] .getAbsolutePath()); if (!flag) break; } } if (!flag) { System.out.println("刪除目錄失敗!"); return false; } // 刪除當前目錄 if (dirFile.delete()) { // System.out.println("刪除目錄" + dir + "成功!"); return true; } else { return false; } } /** * 刪除單個檔案 * * @param fileName * 要刪除的檔案的檔名 * @return 單個檔案刪除成功返回true,否則返回false * @throws Exception */ private static boolean deleteFile(String fileName) throws Exception { File file = new File(fileName); // 如果檔案路徑所對應的檔案存在,並且是一個檔案,則直接刪除 if (file.exists() && file.isFile()) { boolean falg=false; int tryCount = 0; while(!falg && tryCount++ <10) { System.gc(); falg = file.delete(); } if (falg) { // System.out.println("刪除單個檔案" + fileName + "成功!"); return true; } else { System.out.println("刪除單個檔案" + fileName + "失敗!"); return false; } } else { System.out.println("刪除單個檔案失敗:" + fileName + "不存在!"); return false; } } 壓縮包改名 private void changeName(String path){ File file = new File(path); file.renameTo(new File(path.substring(0,path.lastIndexOf("."))+".war" )); } import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Iterator; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import javax.servlet.http.HttpServletRequest; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView;