1. 程式人生 > >修改tomcat部署下,專案配置(涉及properties,xml,zip,war之間相互轉換修改)

修改tomcat部署下,專案配置(涉及properties,xml,zip,war之間相互轉換修改)

 思路:傳入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;