0

当我使用路径引用 ID 时,Ant 似乎会在任何任务运行之前评估定义中的任何变量。例如,${common.dist}以下${common.lib}似乎在任何任务运行之前进行评估。

<path id="compile.classpath">
      <fileset dir="lib">
         <include name="*.jar" />
      </fileset>
      <fileset dir="${common.dist}">
         <include name="*.jar" />
      </fileset>
      <fileset dir="${common.lib}">
         <include name="*.jar" />
      </fileset>
</path>

在 Ant 输出中,我看到如下内容:

Adding reference: compile.classpath
Property "common.dist" has not been set
Property "common.lib" has not been set
...
Build sequence for target(s) `package' is [...]
Complete build sequence is [...]

这使得在运行任何目标之前似乎正在处理路径引用。

我有一个这样的编译目标:

  <target name="compile" depends="init,common">
    <javac destdir="build/classes" debug="true" deprecation="true" optimize="true">
      <src path="src/java" />
      <classpath>
        <path refid="compile.classpath" />
      </classpath>
    </javac>
  </target>

如果我将路径引用的内容复制到编译目标内的类路径元素中,事情似乎工作正常。

4

2 回答 2

2

答案在Ant 手册路径中,如结构

默认情况下,类似结构的路径将在使用时重新评估所有嵌套资源集合,这可能会导致对文件系统进行不必要的重新扫描...

我想你可能忘了设置 ${common.dist} 和 ${common.lib} 属性。它们应该在任何目标之外:

<property name="common.dist" location="dist"/>
<property name="common.lib" location="lib"/>
于 2013-04-04T20:58:25.507 回答
2

build.xml在运行任何目标之前,目标之外的任何任务都会在每个构建中执行,按照出现的顺序。如果要在<path>目标外部定义的属性中使用属性,则需要将<property>定义属性的任务也放在目标之外,并且在<path>. 如果您需要在目标中加载属性,那么您也必须将<path>定义放入目标中(相同的定义或在定义属性的定义之后运行的定义)。

有关更多详细信息,请参阅此问题(和我的答案)。

于 2013-04-04T21:19:27.253 回答