2014-02-21 5 views
0

Я пытаюсь создать систему, в которой я могу использовать общий файл build.xml в качестве шаблона для подавляющего большинства наших сборников. Я очень близко. В принципе, файл build.xml на уровне приложения должен просто определить несколько вещей (целевую банку, зависимости (как список) и несколько других состояний состояния), а затем импортировать шаблон build.xml.Ant (with ant-contrib) build - path/dependency issue - Ссылка не найдена

Проблема заключается в том, что я пытаюсь использовать зависимости и создавать программный путь classpath. Думаю, я очень близка. Однако, как только путь к классам ссылается на этапе компиляции, он пытается разрешить ссылку, которая, казалось бы, была должным образом подготовлена ​​до того, как произойдет этап компиляции. И это приводит к ошибке BUILD FAILED: Ссылка cpDependency4 не найдена.

Примечание: материал COTS хранится в той же директории, поэтому выполнение этой части работы было тривиальным. Все зависимости от проекта зависят от разных подкаталогов и требуют также вложения в каталог child dependencies /.

Вот пример из элементов, подготовленных в build.xml приложения:

<property name="PROJECT_DEPENDENCIES" value="/path/to/other/dependency1,/path/to/other/dependency2,/path/to/other/dependency3,/path/to/other/dependency4" /> 
<property name="COTS_DEPENDENCIES" value="commons-io-*.jar,log4j-*.jar,spring-aop-*.RELEASE.jar,spring-beans-*.RELEASE.jar,spring-context-*.RELEASE.jar,spring-core-*.RELEASE.jar,spring-jms-*.RELEASE.jar,spring-oxm-*.RELEASE.jar,spring-web-*.RELEASE.jar"/> 
<!-- ... --> 
<import file="${DEVELOPMENT_BASE_DIR}/common/ant/antTemplate.xml" /> 

, а затем файл antTemplate содержит:

<path id="cpDependency0" /> 
<var name="trackDependencyPath" value="cpDependency0" /> 
<var name="index" value="0"/>   
<for list="${PROJECT_DEPENDENCIES}" param="dependency"> 
    <sequential> 
    <var name="prior" value="${index}"/> 
    <math result="index" operand1="${index}" operation="+" operand2="1" datatype="int" />   
    <property name="var${index}" value="@{dependency}" /> 
    <path id="cpDependency${index}">   
     <path refid="cpDependency${prior}"/> 
     <fileset dir="@{dependency}/jar/${env}" includes="*.jar" /> 
     <fileset dir="@{dependency}/jar/${env}/dependencies" includes="*.jar" /> 
    </path> 
    <var name="trackDependencyPath" value="cpDependency${index}" /> 
    </sequential>  
</for> 

<path id="classpath.compile">  
    <fileset dir="${COTS_DIR}/main" includes="${COTS_DEPENDENCIES}" />    
    <path refid="${trackDependencyPath}" /> 
</path> 

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

Я получаю следующую ошибку (на javac линия):

BUILD FAILED 
/path/to/common/ant/antTemplate.xml:188: Reference cpDependency4 not found. 
+0

Не прямо отвечая на ваш вопрос, но я бы посоветовал расследование использования плюща для управления к классам. Кроме того, ANT libs - очень полезный способ управления общей логикой сборки.Пример ANT lib см .: http://stackoverflow.com/questions/15643191/how-to-manage-a-common-ant-build-script-across-multiple-project-build-jobs-on-je/15647898 # 15647898 –

ответ

1

Ваша проблема в том, что:

<path id="classpath.compile">  
    <fileset dir="${COTS_DIR}/main" includes="${COTS_DEPENDENCIES}" />    
    <path refid="${trackDependencyPath}" /> 
</path> 

относится не к RefID, но к свойству (или antcontrib переменной), которая в этом случае
имеет то же значение => ' cpDependency4'

- EDIT после комментария -

Даже используя строку 'cpDependency4' не поможет, как идентификатор пути никогда не устанавливается должным образом в течение цикла, так как некоторые тест показывает:

<for list="${PROJECT_DEPENDENCIES}" param="dependency"> 
    <sequential> 
    ... 
    <var name="trackDependencyPath" value="cpDependency${index}" /> 
    <!-- put pathconvert here --> 
    </sequential>  
</for> 

Try:

<pathconvert property="foo"><path refid="cpDependency4"/></pathconvert> 

или

<pathconvert property="foo"><path refid="cpDependency${index}"/></pathconvert> 

и вы получите:

Reference cpDependency4 not found. 

в обоих случаях. Увеличение noiselevel для отладки и вы увидите:

Adding reference: cpDependency0 
Setting ro project property: trackDependencyPath -> cpDependency0 
Setting ro project property: index -> 0 
Setting ro project property: prior -> 0 
Setting ro project property: index -> 1 
Setting project property: var1 -> /path/to/other/dependency1 
Adding reference: cpDependency${index} 
Property "env" has not been set 
Property "env" has not been set 
Setting ro project property: trackDependencyPath -> cpDependency1 
Setting ro project property: prior -> 1 
Setting ro project property: index -> 2 
Setting project property: var2 -> /path/to/other/dependency2 
Overriding previous definition of reference to cpDependency${index} 
Adding reference: cpDependency${index} 
Property "env" has not been set 
Property "env" has not been set 
Setting ro project property: trackDependencyPath -> cpDependency2 
Setting ro project property: prior -> 2 
Setting ro project property: index -> 3 
Setting project property: var3 -> /path/to/other/dependency3 
Overriding previous definition of reference to cpDependency${index} 
Adding reference: cpDependency${index} 
Property "env" has not been set 
Property "env" has not been set 
Setting ro project property: trackDependencyPath -> cpDependency3 
Setting ro project property: prior -> 3 
Setting ro project property: index -> 4 
Setting project property: var4 -> /path/to/other/dependency4 
Overriding previous definition of reference to cpDependency${index} 
Adding reference: cpDependency${index} 
+0

Хорошо - это имеет смысл - но знаете ли вы способ получить желаемое поведение здесь? Что меня смущает, но это то, что refid является строкой - и я получаю явное имя из нее. Если я явно помещаю имя «cpDependency4» в refid - он дает ту же ошибку (и cpDependency4 - путь муравья, а не что-то связанное с ant-contrib). – humanity

+0

Wild - поэтому он выглядит так: $ {index} не интерпретируется в цикле. Dagnabit. И, спасибо за помощь! На самом деле это не решение, а хорошее объяснение. – humanity

+0

Yep - не придумал решение, но ваш сценарий кажется сложным, я уверен, что есть более простое решение. Если вам требуется полноценное управление зависимостями, взгляните на другой проект apache - хорошо играйте с муравьиным именем Ivy => https://ant.apache.org/ivy/https://ant.apache.org/ivy/ – Rebse

Смежные вопросы