ant,使用目录结构复制文件

CaiNiaoCoder

我正在尝试编写一个蚂蚁脚本来自动化我们的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 [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>
马丁·克莱顿

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用MSBuild从文件列表复制目录结构

来自分类Dev

如何使用ant将文件复制到特定目录?

来自分类Dev

Ant仅复制文件而不复制目录

来自分类Dev

在保留Mac目录结构的同时复制文件

来自分类Dev

在保留目录结构的同时复制文件

来自分类Dev

复制没有文件的目录结构

来自分类Dev

Robocopy:复制没有目录结构的文件

来自分类Dev

递归查找修改后的文件,并使用保留目录结构的目录进行复制

来自分类Dev

Unix / Mac OS X:使用文件列表复制文件和文件夹,并保持目录结构

来自分类Dev

如何使用ant任务进行文件和目录的递归复制

来自分类Dev

使用ANT将文件从本地目录复制到映射的驱动器

来自分类Dev

在Mac OS X上复制目录结构而不复制文件

来自分类Dev

使用基本目录复制文件

来自分类Dev

使用文件结构将所有文件从源目录复制到C#中的目标目录

来自分类Dev

使用PowerShell将文件从工作站复制到服务器,并保留目录结构

来自分类Dev

如何使用python复制文件,重新创建目录结构?

来自分类Dev

使用PowerShell将文件从工作站复制到服务器,并保留目录结构

来自分类Dev

使用Gulp复制文件目录和文件

来自分类Dev

使用Gulp复制文件目录和文件

来自分类Dev

从目录结构复制文件,路径中带有通配符

来自分类Dev

linux cpio复制目录结构和文件名?

来自分类Dev

从列表中复制文件,同时保持子目录结构

来自分类Dev

复制保留目录结构的文件列表,不带脚本

来自分类Dev

复制具有随机数量文件的目录结构

来自分类Dev

将目录结构复制到枚举的文件夹

来自分类Dev

是否可以使用ant ftp任务复制空目录

来自分类Dev

使用Grunt.js将所有HTML文件从一个目录结构复制到另一目录结构

来自分类Dev

使用PowerShell将文件夹和子文件夹中的复制项文件复制到源服务器的同一目录结构中

来自分类Dev

ANT反转(反向)目录结构

Related 相关文章

  1. 1

    使用MSBuild从文件列表复制目录结构

  2. 2

    如何使用ant将文件复制到特定目录?

  3. 3

    Ant仅复制文件而不复制目录

  4. 4

    在保留Mac目录结构的同时复制文件

  5. 5

    在保留目录结构的同时复制文件

  6. 6

    复制没有文件的目录结构

  7. 7

    Robocopy:复制没有目录结构的文件

  8. 8

    递归查找修改后的文件,并使用保留目录结构的目录进行复制

  9. 9

    Unix / Mac OS X:使用文件列表复制文件和文件夹,并保持目录结构

  10. 10

    如何使用ant任务进行文件和目录的递归复制

  11. 11

    使用ANT将文件从本地目录复制到映射的驱动器

  12. 12

    在Mac OS X上复制目录结构而不复制文件

  13. 13

    使用基本目录复制文件

  14. 14

    使用文件结构将所有文件从源目录复制到C#中的目标目录

  15. 15

    使用PowerShell将文件从工作站复制到服务器,并保留目录结构

  16. 16

    如何使用python复制文件,重新创建目录结构?

  17. 17

    使用PowerShell将文件从工作站复制到服务器,并保留目录结构

  18. 18

    使用Gulp复制文件目录和文件

  19. 19

    使用Gulp复制文件目录和文件

  20. 20

    从目录结构复制文件,路径中带有通配符

  21. 21

    linux cpio复制目录结构和文件名?

  22. 22

    从列表中复制文件,同时保持子目录结构

  23. 23

    复制保留目录结构的文件列表,不带脚本

  24. 24

    复制具有随机数量文件的目录结构

  25. 25

    将目录结构复制到枚举的文件夹

  26. 26

    是否可以使用ant ftp任务复制空目录

  27. 27

    使用Grunt.js将所有HTML文件从一个目录结构复制到另一目录结构

  28. 28

    使用PowerShell将文件夹和子文件夹中的复制项文件复制到源服务器的同一目录结构中

  29. 29

    ANT反转(反向)目录结构

热门标签

归档