16

我有一个 Ant 构建文件,我尝试使用以下命令在命令行中执行它:

$ C:\Program Files (x86)\.....>ant -f C:\Silk4J\Automation\iControlSilk4J\build.xml

但是什么也没发生,结果是:

BUILD SUCCESSFUL
Total time: 0 seconds

我的环境变量是正确的。
问题是什么?这是我的构建文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- WARNING: Eclipse auto-generated file.
              Any modifications will be overwritten.
              To include a user specific buildfile here, simply create one in the same
              directory with the processing instruction <?eclipse.ant.import?>
              as the first entry and export the buildfile again. -->
<project basedir="." default="build" name="iControlSilk4J">
    <property environment="env"/>
    <property name="ECLIPSE_HOME" value="../../../Program Files (x86)/Silk/SilkTest/eclipse"/>
    <property name="junit.output.dir" value="junit"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="1.6"/>
    <property name="source" value="1.6"/>
    <path id="Silk Test JTF 13.5.0 Library.libraryclasspath">
        <pathelement location="../../../Program Files (x86)/Silk/SilkTest/ng/JTF/silktest-jtf-nodeps.jar"/>
    </path>
    <path id="JUnit 4.libraryclasspath">
        <pathelement location="${ECLIPSE_HOME}/plugins/org.junit_4.8.2.v4_8_2_v20110321-1705/junit.jar"/>
        <pathelement location="${ECLIPSE_HOME}/plugins/org.hamcrest.core_1.1.0.v20090501071000.jar"/>
    </path>
    <path id="iControlSilk4J.classpath">
        <pathelement location="bin"/>
        <pathelement location="lib/apache-log4j.jar"/>
        <pathelement location="lib/commons-io-2.4.jar"/>
        <pathelement location="lib/commons-lang3-3.1.jar"/>
        <pathelement location="lib/junit.jar"/>
        <pathelement location="lib/org.hamcrest.core_1.1.0.v20090501071000.jar"/>
        <pathelement location="lib/silktest-jtf-nodeps.jar"/>
        <path refid="Silk Test JTF 13.5.0 Library.libraryclasspath"/>
        <path refid="JUnit 4.libraryclasspath"/>
        <pathelement location="../../../Users/Admin/Desktop/java-mail-1.4.4.jar"/>
        <pathelement location="../../../Users/Admin/Desktop/javax.activation.jar"/>
        <pathelement location="lib/joda-time-2.3.jar"/>
    </path>
    <target name="init">
        <mkdir dir="bin"/>
        <copy includeemptydirs="false" todir="bin">
            <fileset dir="src">
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>
    <target name="clean">
        <delete dir="bin"/>
    </target>
    <target depends="clean" name="cleanall"/>
    <target depends="build-subprojects,build-project" name="build"/>
    <target name="build-subprojects"/>
    <target depends="init" name="build-project">
        <echo message="${ant.project.name}: ${ant.file}"/>
        <javac debug="true" debuglevel="${debuglevel}" destdir="bin" source="${source}" target="${target}">
            <src path="src"/>
            <classpath refid="iControlSilk4J.classpath"/>
        </javac>
    </target>
    <target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/>
    <target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">
        <copy todir="${ant.library.dir}">
            <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
        </copy>
        <unzip dest="${ant.library.dir}">
            <patternset includes="jdtCompilerAdapter.jar"/>
            <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
        </unzip>
    </target>
    <target description="compile project with Eclipse compiler" name="build-eclipse-compiler">
        <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
        <antcall target="build"/>

...
4

3 回答 3

23

去蚂蚁网站下载。这样,您就拥有了Eclipse之外的 Ant 副本。我建议把它放在C:\ant目录下。这样,目录名称中就没有任何空格。在您的系统控制面板中,将环境变量ANT_HOME设置为此目录,然后在系统PATH变量前面添加%ANT_HOME%\bin. 这样,您不必输入整个目录名称。

假设您执行了上述操作,请尝试以下操作:

C:\> cd \Silk4J\Automation\iControlSilk4J
C:\Silk4J\Automation\iControlSilk4J> ant -d build

这将做几件事:

  • 它将消除问题出在 Ecipe 版本的 Ant 的可能性。
  • 打字更容易
  • 由于您是build.xml在它存在的目录中执行的,因此您最终不会遇到 Ant 构建无法找到特定目录的可能性。

-d打印出大量输出,因此您可能想要捕获它,或者将终端缓冲区设置为类似99999,然后cls首先运行以清除缓冲区。这样,您将在终端缓冲区中从头开始捕获所有输出。

让我们看看 Ant 应该如何执行。您没有指定任何要执行的目标,因此 Ant 应该采用默认build目标。这里是:

<target depends="build-subprojects,build-project" name="build"/>

build目标本身什么也不做。但是,它依赖于另外两个目标,因此将首先调用它们:

第一个目标是build-subprojects

<target name="build-subprojects"/>

这根本没有任何作用。它甚至没有依赖关系。

指定的下一个目标build-project确实有代码:

<target depends="init" name="build-project">

该目标确实包含任务一些依赖目标。在build-project执行之前,它将首先运行init目标:

<target name="init">
    <mkdir dir="bin"/>
    <copy includeemptydirs="false" todir="bin">
        <fileset dir="src">
            <exclude name="**/*.java"/>
        </fileset>
    </copy>
</target>

此目标创建一个名为 的目录bin,然后将src树下的所有带有后缀的文件复制*.java到该bin目录。这includeemptydirs意味着不会创建没有非 java 代码的目录。

Ant 使用一种方案来做最少的工作。例如,如果bin创建了目录,<mkdir/>则不会执行任务。src此外,如果之前复制了一个文件,或者目录树中没有非 Java 文件,则该<copy/>任务将不会运行。但是,init目标仍将被执行。

接下来,我们回到之前的build-project目标:

<target depends="init" name="build-project">
    <echo message="${ant.project.name}: ${ant.file}"/>
    <javac debug="true" debuglevel="${debuglevel}" destdir="bin" source="${source}" target="${target}">
        <src path="src"/>
        <classpath refid="iControlSilk4J.classpath"/>
    </javac>
</target>

看看这一行:

<echo message="${ant.project.name}: ${ant.file}"/>

那应该一直执行。您的输出是否打印:

[echo] iControlSilk4J: C:\Silk4J\Automation\iControlSilk4J\build.xml

也许你没有意识到那是你的构建。

之后,它运行<javac/>任务。也就是说,如果有任何文件要实际编译。再一次,Ant 试图避免它不需要做的工作。如果*.java之前已编译所有文件,则该<javac/>任务将不会执行。

而且,这就是构建的结束。您的构建可能仅仅因为无事可做而没有做任何事情。您可以尝试运行clean任务,然后build

C:\Silk4J\Automation\iControlSilk4J> ant -d clean build

但是,Ant 通常会打印正在执行的目标。你应该已经看到了:

init:

build-subprojects:

build-projects:

    [echo] iControlSilk4J: C:\Silk4J\Automation\iControlSilk4J\build.xml

build:

Build Successful

请注意,目标都是按照执行的顺序打印出来的,而任务是在执行时打印出来的。但是,如果没有要编译的内容或要复制的内容,那么您将看不到这些任务正在执行。这看起来像你的输出吗?如果是这样,那可能是无事可做。

  • 如果bin目录已经存在,<mkdir/>则不会执行。
  • 如果 中没有非 Java 文件src,或者它们已经被复制到bin中,则<copy/>任务不会执行。
  • 如果您的目录中没有 Java 文件src,或者它们已经被编译,则该<java/>任务将不会运行。

如果您查看-d调试的输出,您会看到 Ant 正在查看一个任务,然后解释为什么某个特定任务没有执行。另外,调试选项将解释 Ant 如何决定要执行的任务。

看看是否有帮助。

于 2014-08-21T02:49:35.507 回答
0

它仍然是真实的吗?

正如我所看到的,你写了<target depends="build-subprojects,build-project" name="build"/>,然后你写了<target name="build-subprojects"/>(它什么都不做)。这可能是一个原因吗?这是否<echo message="${ant.project.name}: ${ant.file}"/>打印适当的消息?如果不是,则目标未运行。看看下一个链接http://www.sqaforums.com/showflat.php?Number=623277

于 2013-10-01T16:38:30.613 回答
0

尝试单独运行所有目标以检查所有目标是否正确运行

run ant target name 单独运行一个目标

例如蚂蚁构建项目

您指定的默认目标也是

基于项目的ir =“。” 默认=“构建”名称=“iControlSilk4J”

这只会执行 build-subprojects、build-project 和 init

于 2014-04-22T04:45:16.810 回答