2013-04-04 8 views
0

Когда я использую идентификатор ссылки пути, Ant, кажется, оценивает любые переменные внутри определения перед выполнением любых задач. Например, и ${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> 

Если я скопировать начинку ссылки путь в пути к классам элемента внутри цели компиляции, вещи, кажется, работает хорошо.

ответ

2

Любые задачи вне цели выполняются на каждой сборки, в порядке появления в build.xml, прежде чем любые цели выполняются. Если вы хотите использовать свойства в <path>, определенные вне цели, тогда вам нужно поставить задачу <property>, которая определяет свойства также вне цели, и до <path>. Если вам нужно загрузить свойства в пределах целевого объекта, вам нужно будет поместить определение <path> внутри цели (либо тот же, либо один, который запускается после определения свойств).

См. this question (и мой ответ) для получения более подробной информации.

+0

Спасибо. Я переместил определения свойств из цели и выше определения пути, и он сработал. – braveterry

2

Ответ в Ant manual - path like structures:

По умолчанию путь, как структура будет переоценивать все вложенные ресурсу коллекции всякий раз, когда он используется, что может привести к ненужным повторного сканирования из файловая система ...

Возможно, вы, возможно, забыли установить свойства $ {common.dist} и $ {common.lib}. Они должны быть вне любой цели:

<property name="common.dist" location="dist"/> 
<property name="common.lib" location="lib"/> 
Смежные вопросы