2013-04-04 55 views
0

當我使用路徑引用ID時,Ant似乎在任何任務運行之前評估定義內的任何變量。例如,下面的${common.dist}${common.lib}似乎在任何任務運行之前進行評估。Ant路徑引用何時設置?

<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

目標之外的任何任務在build.xml上每次構建執行時,在出現的順序,任何目標運行之前。如果要使用在目標外部定義的<path>中的屬性,則需要將定義屬性的<property>任務也放置在目標外,並且在<path>之前。如果您需要在目標中加載屬性,那麼您必須將<path>定義也放入目標中(或者是定義屬性的定義之一,也可以是同一個)。

查看this question(和我的回答)瞭解更多詳情。

+0

謝謝。我將屬性定義從目標中移出並在路徑定義的上方運行。 – braveterry 2013-04-05 12:16:50

2

答案是在Ant manual - path like structures

默認狀結構的路徑將重新評估所有嵌套資源 集合時,它是用來,這可能會導致不必要的 重新掃描文件系統...

我想你可能忘了設置$ {common.dist}和$ {common.lib}屬性。他們應該有什麼目標之外:

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