【问题标题】:When are Ant path references set?什么时候设置 Ant 路径引用?
【发布时间】:2013-04-05 06:29:32
【问题描述】:

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

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

【问题讨论】:

    标签: java ant build


    【解决方案1】:

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

    请参阅this question(和我的回答)了解更多详情。

    【讨论】:

    • 谢谢。我将属性定义移出目标并移到路径定义之上,它起作用了。
    【解决方案2】:

    答案在Ant manual - path like structures

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 2021-07-28
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      相关资源
      最近更新 更多