2013-12-19 48 views
2

我想寫一個螞蟻腳本來自動化我們的web應用程序的更新過程。螞蟻,它的目錄結構複製文件

當某些文件將要更新時,我需要備份該文件。我的問題是如何將該文件複製到備份目錄,並創建相對於我的Web應用程序根目錄的目錄結構?

例如:

${WEB_APP_ROOT}/dir1/file1 
${WEB_APP_ROOT}/dir2/subdir1/file2 

複製到備份文件夾應該是:

${BACK_UP_DIR}/dir1/file1 
${BACK_UP_DIR}/dir2/subdir1/file2 
目前

,我只能所有文件複製到備份文件夾,但如果兩個文件名稱相同,但位於不同的文件夾會導致問題。

我的ant代碼:

<?xml version="1.0" encoding="UTF-8" ?> 
<!-- 對公信貸自動更新Ant任務腳本 created by [email protected] at 2013.11.14 --> 
<project default="patch" basedir="."> 
    <!-- 引入Weblogic安裝目錄下的antcontrib包,才能使用if,foreach,propertyregex--> 
    <taskdef resource="net/sf/antcontrib/antlib.xml"> 
     <classpath> 
      <pathelement location="/home/weblogic/Oracle/Middleware/modules/net.sf.antcontrib_1.1.0.0_1-0b2/lib/ant-contrib.jar" /> 
     </classpath> 
    </taskdef> 

    <!-- 發佈目標路徑 --> 
    <property name="target_dir" value="/home/weblogic/amarsoft/ccms/war/CCMS" /> 
    <!-- 數據庫連接配置屬性 --> 
    <property name="db_driver" value="oracle.jdbc.OracleDriver" /> 
    <property name="db_url" value="jdbc:oracle:thin:@10.53.1.116:1521:credit" /> 
    <property name="db_user" value="als_sit" /> 
    <property name="db_pswd" value="als_sit" /> 
    <!-- WLST配置 --> 
    <property name="wl_target_server" value="AdminServer" /> 
    <property name="wl_admin_url" value="t3://10.53.1.117:7001" /> 
    <property name="wl_user" value="weblogic" /> 
    <property name="wl_pswd" value="weblogic123" /> 
    <property name="wl_app_name" value="CCMS" /> 

    <target name="patch"> 
     <!-- 檢查是否存在WEB-INF目錄,如果有則說明更新了配置文件或者JAVA類需要重新加載應用 --> 
     <available file="${patch_dir}/WebRoot/WEB-INF" type="dir" property="WEB-INF.present"/> 
     <!-- 檢查是否存在數據庫更新腳本 --> 
     <available file="${patch_dir}/update.sql" type="file" property="sql.present"/> 

     <!-- 創建備份目錄 --> 
     <mkdir dir="${patch_dir}/backup" /> 
     <!-- 針對單個文件,檢查是否更新還是新增,如果是更新則要先備份 --> 
     <foreach target="move-to-backup" param="theFile"> 
      <path> 
       <fileset dir="${patch_dir}/WebRoot" /> 
      </path> 
     </foreach> 
     <!-- 提醒用戶檢查更新列表預覽 --> 
     <input message="Is patching preview above correct?" validargs="y,n" addproperty="patch.continue" /> 
     <!-- 用戶確認無誤則更新 --> 
     <if> 
      <equals arg1="${patch.continue}" arg2="y" /> 
      <then> 
       <!-- 存在WEB-INF目錄,則先停止應用 --> 
       <if> 
        <equals arg1="${WEB-INF.present}" arg2="true" /> 
        <then> 
         <echo message="Directory [WEB-INF] found in patching dir, application will be stoped" /> 
         <wldeploy action="stop" graceful="true" name="${wl_app_name}" user="${wl_user}" password="${wl_pswd}" 
          verbose="true" adminurl="${wl_admin_url}" targets="${wl_target_server}" /> 
        </then> 
       </if> 
       <copy todir="${target_dir}" verbose="true"> 
        <fileset dir="${patch_dir}/WebRoot/" /> 
       </copy> 
       <!-- 存在數據庫更新腳本則執行 --> 
       <if> 
        <equals arg1="${sql.present}" arg2="true" /> 
        <then> 
         <sql driver="${db_driver}" url="${db_url}" userid="${db_user}" password="${db_pswd}"> 
          <classpath> 
           <pathelement location="/home/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/ojdbc6.jar" /> 
          </classpath> 
          <transaction src="${patch_dir}/update.sql"/> 
         </sql> 
        </then> 
       </if> 
       <!-- 更新完成後,重啓應用 --> 
       <if> 
        <equals arg1="${WEB-INF.present}" arg2="true" /> 
        <then> 
         <echo message="Application will be started again." /> 
         <wldeploy action="start" name="${wl_app_name}" user="${wl_user}" password="${wl_pswd}" 
          verbose="true" adminurl="${wl_admin_url}" targets="${wl_target_server}" /> 
        </then> 
       </if> 
       <echo message="Patching done! " /> 
      </then> 
     </if> 
    </target> 

    <target name="move-to-backup"> 
     <propertyregex property="target.file" input="${theFile}" regexp=".+/${patch_dir}/WebRoot/(.+)" replace="${target_dir}/\1" casesensitive="true" /> 
     <available file="${target.file}" type="file" property="target.file.exist" /> 
     <if> 
      <equals arg1="${target.file.exist}" arg2="true" /> 
      <then> 
       <echo message="[UPDATE] ${target.file}" /> 
       <copy todir="${patch_dir}/backup" verbose="false"> 
        <fileset file="${target.file}" /> 
       </copy> 
      </then> 
      <else> 
       <echo message="[ADD ] ${target.file}" /> 
      </else> 
     </if> 
    </target> 
</project> 

回答

3

在你的目標move-to-backup你有這個副本任務:

<copy todir="${patch_dir}/backup" verbose="false"> 
    <fileset file="${target.file}" /> 
</copy> 

當你定義一個文件集作爲一個單獨的文件,它使用含有該文件的目錄文件集的基本目錄以及文件的路徑與此相關:簡單地說是文件的名稱。

你可以做這樣的事情,而不是,這樣的路徑,將要複製的文件是相對於應用程序的根目錄:

<copy todir="${patch_dir}/backup" verbose="false"> 
    <fileset dir="${WEB_APP_ROOT}"> 
     <include name="${target.file}" /> 
    </fileset> 
</copy> 

如果你的文件是

${WEB_APP_ROOT}/x/y/z/file.txt 

它將被複制到

${patch_dir}/backup/x/y/z/file.txt 
+0

include元素的名稱屬性應該是相對於應用程序根目錄的路徑,完整路徑名稱爲包含模式不起作用 – CaiNiaoCoder