Загрузка библиотек ant после загрузки

#ant #download #classpath #taskdef

#ant #Скачать #путь к классу #taskdef

Вопрос:

Я пытаюсь написать 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’ (с fork).

Это Ant 1.7.0 с JDK 1.6.0_11 в Ubuntu 10.10 и RedHat ELS6. Код обнаружения / предотвращения удален для краткости. При включенной отладке единственная разница между рабочим вызовом и неудачным заключается в том, что отсутствующий jar включен в путь к классу ant, который я пытаюсь переопределить в задаче taskdef.

Я был бы не против создать новый вызов ant верхнего уровня, но ivy.project.invoked-targets, похоже, недоступен в 1.7.0, и я не нашел другого способа вызвать ant с теми же начальными целями.

Ответ №1:

Это не сработает из коробки: это связано с тем фактом, что загрузчики классов Java работают рекурсивно и ОНИ разрешают зависимости, а не сам Ant.

Мне жаль вас, я думаю, что это недостижимо без самостоятельной разработки расширения Ant, и у меня нет ни малейшего представления о том, как это сделать.