我正在尝试编写一个蚂蚁脚本来自动化我们的Web应用程序的更新过程。

当某些文件将要更新时,我需要备份该文件。我的问题是如何将文件复制到备份目录,并相对于Web应用程序的根目录创建目录结构?

例如:

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


复制到备份文件夹应为:

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


目前,我只能将所有文件复制到备份文件夹,但是如果两个具有相同名称但位于不同文件夹中的文件将导致问题。

我的蚂蚁代码:

<?xml version="1.0"  encoding="UTF-8" ?>
<!-- 对公信贷自动更新Ant任务脚本 created by ggfan@bgzchina.com 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>

最佳答案

在目标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

10-07 16:01
查看更多