1

我正在尝试编写一个简单的 ANT 脚本,将文件/文件夹复制到指定目录。例如通过运行:

ant deploy src/classes/myClass.class

文件“myClass.class”从“src/classes/”复制到“deploy/src/classes/”。此外,这应该适用于指定的文件夹,以便运行:

ant deploy src/classes/

应该将所有文件从 src/classes 复制到“deploy/src/classes”。此外,在脚本运行之前目标文件夹将不存在,因此需要先“触摸”...

从环顾四周复制文件并不是一个真正的问题,但我无法弄清楚如何让它与参数一起工作(如上所述)......

有谁知道如何激活它?

4

4 回答 4

1

Ant 不是计算机语言。它是一种矩阵依赖语言。

区别是微妙的:编程语言要灵活得多,但你必须告诉它要采取的每一步。矩阵依赖语言计算出执行顺序。

这可能是一个微妙但重要的区别。在标准 Ant 中,缺少基本的控制结构,如 while 循环、for 循环和 if/then 语句。

听起来你想要做的事情使用标准的计算机语言会容易得多。也许是 Python、Perl,甚至是一个 shell 脚本。

在命令行中键入“ant -help”,您会发现没有像使用常规编程语言那样将参数传递给 Ant 的真正方法。相反,您可以在 Ant 可以使用的命令行上设置属性:

$ant -Ddeploy.classfile=src/classes/myClass.class deploy

-D 允许您在调用部署任务时设置属性。然后,您可以使用deploy.classfile属性在 Ant 中使用它你的任务目标。我粗略估计,即使是这样一个简单的build.xml文件也需要大约 20 到 30 行。尤其如此,您将为其提供一个类文件或目录,并且您必须以不同的方式处理它们,这需要第二个目标。不仅如此,而且很难理解工作流程。

这是一个想法,为什么不首先在任务中使用destdir目标在目录中<javac>创建所需的*.class文件deploy。Ant 的主要实践之一是将您构建的文件与存储库中的文件分开。它使清理工作变得容易得多。另外,该<javac>任务知道不要为未更改的源文件重建类文件。

<target name="compile"
    description="Compile your source files">

    <property name="main.destdir" value="${basedir}/deploy/classes"/>
    <property name="main.srcdir" value="${basedir}/src"/>

    <path id="main.classpath">
        <fileset dir="${basedir}/lib/>
    </path>

    <javac srcdir="${main.srcdir}"
        destdir="${main.destdir}"
        classpathref="main.classpath"/>
</target>

现在,您不必将文件从源目录复制到部署目录。更好的是,<javac>不会重新编译未更改的源文件。让 Ant 完成它所设计的工作,而对于其他一切,请使用良好的脚本语言。

于 2012-08-17T16:46:00.240 回答
1

如果您在更改输入命令行字符串时没有问题,那么这里应该可以工作。

<?xml version="1.0" encoding="UTF-8" ?>
<project name="Deploy" default="copy">

    <!--
        This script is called in the following manner:

        ant deploy -Dsource.dir=src/classes     (to copy the entire directory)
        ant deploy -Dsource.dir=src/classes -Dsource.module=myClass.class
                                                (to copy one class)

    -->

    <!-- <property name="source.dir" value="src/com/ggl/unzip" />  -->
    <!-- <property name="source.module" value="myClass.class" />  -->

    <target name="copy">
        <condition property="source.module.text" value="all files">
            <not>
                <isset property="source.module" />
            </not>
        </condition>

        <condition property="source.module" value="**.*">
            <not>
                <isset property="source.module" />
            </not>
        </condition>

        <property name="source.module.text" value="${source.module}" />

        <echo>Copying ${source.module.text} from ${source.dir} to deploy/${source.dir}</echo>

        <copy todir="deploy/${source.dir}" overwrite="true" verbose="true">
            <fileset dir="${source.dir}">
                <include name="${source.module}" />
            </fileset>
        </copy>
    </target>

</project>
于 2012-08-17T16:59:48.023 回答
0

要从控制台向 ant 提供值,您需要使用 ant-properties,您可以使用-D前缀传递它们,因此您必须将构建调用为:ant -Ddst=deploy -Dsrc=src/classes/(我也建议切换 src 和dst 位置 - 如在cp命令中)在 build.xml 中,您可以使用${dst}和访问此属性${src}

我不适合你,那么你需要为 ant 创建新的 ant 入口点类并调用

ant -main <YourClass> arg2 arg3

示例在这里(第一个示例)

于 2012-08-17T15:33:29.303 回答
0

为什么不在 shell 脚本中使用老式的好方法cp而不是 ant 脚本呢?cp -r将允许您递归复制目录...

于 2012-08-17T14:12:46.517 回答