Я пытаюсь написать скрипт Ant, который загружает библиотеки (ivy и svnant) из нашего репозитория и использует их как taskdef из того же скрипта сборки.Это работает, если все библиотеки присутствуют или все отсутствуют, но если нужна вторичная библиотека (например, svnClientAdapter), то я получаю ошибку:
jar:file:/home/reillym/.ant/lib/svnant.jar!/org/tigris/subversion/svnant/svnantlib.xml:5: taskdef A class needed by class org.tigris.subversion.svnant.SvnTask cannot be found: org/tigris/subversion/svnclientadapter/SVNClientException
В словах порядка все в порядке, если первичнаябиблиотека существует или не существует;но если первичные библиотеки существуют, а одна из библиотек зависимостей не существует, я получаю ошибку.Если ничего не изменилось, второй вызов завершится успешно.
Я попытался вызвать задачи обнаружения / загрузки из задачи и из класса с тем же результатом.У меня есть код:
<target name="svn-info" depends="load.subverion">
<svn><wcVersion path="${basedir}"/></svn>
</target>
<target name="load.subversion" depends="download.antlib-svn">
<taskdef resource="org/tigris/subversion/svnant/svnantlib.xml">
<!-- needed in case one of libraries was missing from ant's classpath -->
<classpath>
<pathelement location="${user.home}/.ant/lib/svnClientAdapter.jar"/>
<pathelement location="${user.home}/.ant/lib/svnant.jar"/>
<pathelement location="${user.home}/.ant/lib/svnjavahl.jar"/>
</classpath>
</taskdef>
<target name="download.antlib-svn" depends="retrieve.antlib-svn">
<!-- ant target="retrieve.antlib-svn" inheritAll="false"/ -->
</target>
<target name="retrieve.antlib-svn">
<get dest="${user.home}/.ant/lib/svnClientAdapter.jar" usetimestamp="1"
src="${url.ivyrepos}/antlib-svn/svnClientAdapter.jar"/>
<get dest="${user.home}/.ant/lib/svnant.jar" usetimestamp="1"
src="${url.ivyrepos}/antlib-svn/svnant.jar"/>
<get dest="${user.home}/.ant/lib/svnjavahl.jar" usetimestamp="1"
src="${url.ivyrepos}/antlib-svn/svnjavahl.jar"/>
</target>
Если отсутствует только svnant.jar, все работает как положено.Это приводит к ошибке «класс не найден» в задаче taskdef, если отсутствует svnClientAdapter.jar, и в «NoClassDefFoundError» при попытке использовать задачу.Как уже упоминалось, я пробовал, где цель retrieve.antlib-svn вызывается как зависимость, как задача 'ant' и как задача 'java' (с форком).
Это Ant 1.7.0с JDK 1.6.0_11 в Ubuntu 10.10 и RedHat ELS6.Код обнаружения / избегания удален для краткости.При включенной отладке единственное различие между рабочим вызовом и неудачным состоянием заключается в том, что отсутствующий jar включен в classpath муравья, который я пытаюсь переопределить в задаче taskdef.вызов уровня ant, но ivy.project.invoked-target, по-видимому, недоступен в 1.7.0, и я не нашел другого способа вызова ant с теми же начальными целями.