何时设置Ant路径引用?

时间:2013-04-04 20:09:31

标签: java ant build

当我使用路径引用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>

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

2 个答案:

答案 0 :(得分:2)

答案在Ant manual - path like structures

  

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

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

<property name="common.dist" location="dist"/>
<property name="common.lib" location="lib"/>

答案 1 :(得分:2)

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

有关详细信息,请参阅this question(和我的回答)。