Как переопределить задачу ant, хранящуюся в каталоге ant lib

В своей работе мы используем AspectJ в некоторых наших Java-проектах. Чтобы это работало со сборками муравьев, мы разместили аспектjtools.jar в файле ant / lib /.

Сейчас я работаю над конкретным проектом Java, и мне нужно использовать более новую версию аспектаJ. Я не хочу, чтобы каждый, кто использует проект, обновлял свою локальную копию аспектjtools.jar. Вместо этого я попытался добавить более новый аспектjtools.jar в каталог lib проекта и добавить следующую строку в build.xml.

  <taskdef
     resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"
     classpath="./lib/aspectjtools.jar" />

Однако это не работает, как я надеялся, поскольку загрузчик классов ANT загружает jar-файлы из ant / lib / в предпочтение к jar, который я указываю в пути к классам taskdef.

Есть ли способ заставить Ant вместо этого выбрать банку, проверенную в моем проекте?


person mchr    schedule 13.05.2010    source источник
comment
Я пробовал использовать jarjar, чтобы переупаковать аспектj в другой пакет, но это, похоже, сломало аспектj и похоже на гигантский взлом, поэтому я больше не использую этот подход.   -  person mchr    schedule 13.05.2010
comment
Пока я прихожу к выводу, что нет никакого способа заставить ant вместо этого выбирать банку, проверенную в моем проекте. Это кажется странным выбором дизайна, поскольку я ожидал, что файл build.xml для конкретного проекта - лучшее место для выбора, какую версию задачи использовать.   -  person mchr    schedule 14.05.2010
comment
issues.apache.org/bugzilla/show_bug.cgi?id=6606 - Кажется, это давний баг. Я сейчас читаю ветку комментариев.   -  person mchr    schedule 15.06.2010


Ответы (3)


не можете ли вы просто обновить цель компиляции iajc, чтобы использовать новую банку в пути к классам?

Невозможно заставить загрузчик классов предпочесть данный jar-файл другому. Если вы должны относиться к нескольким версиям одного и того же класса, вам следует рассмотреть OSGI.

Самым простым решением будет просто использовать библиотеки из проекта или репозитория Maven / Ivy и игнорировать библиотеки в вашей глобальной папке ant.

Пример:

 <taskdef 
     resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
      <classpath>
         <pathelement location="${basedir.dir}/lib/aspectjtools.jar"/>
      </classpath>
 </taskdef>

 <target name="compile" >
    <iajc outjar="demo.jar">
        <sourceroots>
            <pathelement location=”src” />
        </sourceroots>
        <aspectpath>
            <pathelement 
              location="aspects_to_be_weaved_with_classes_in_sourceroots.jar" />
        </aspectpath>
        <classpath>
            <pathelement location="${basedir}/lib/aspectjrt.jar"/>
        </classpath>
    </iajc>
  </target>

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

У вас также есть другой вариант, но он немного сложнее. То есть вместо этого использовать AspectJ во время загрузки. Если вы выберете эту опцию, вы можете скомпилировать с помощью обычной задачи компиляции, но вы должны выполнить переплетение с агентом JVM при запуске. Подробнее об этом можно прочитать здесь.

Надеюсь, это поможет!

person Espen    schedule 13.05.2010
comment
Спасибо за ответ. Я завтра проверю, работает ли это. - person mchr; 14.05.2010
comment
Это не решает мою проблему. Элемент taskdef позволяет указать путь к классам, но мое тестирование показывает, что этот путь к классам вставлен в конец существующего пути к классам. Это означает, что ANT всегда будет использовать аспектjtools.jar в каталоге ant / lib / вместо любой версии, указанной в пути к классам taskdef. - person mchr; 14.05.2010
comment
Спасибо за обновление - я вижу, что использование другой копии ant решит мою проблему, но только в обход проблемы. Изменение времени загрузки - еще одно допустимое решение, но оно кажется особенно сложным. Неужели для ANT так неразумно предоставлять в проекте механизм, заставляющий использовать версию задачи? - person mchr; 14.05.2010
comment
Если я правильно понял, проблема не в Ant, а в том, как загрузчики классов работают в Java. Вы можете столкнуться с той же проблемой, если у вас есть старая версия библиотеки в папке lib веб-контейнера, и вы хотите переопределить один из этих классов классом из библиотеки в вашем военном файле. Попробуйте использовать другую версию Ant без Aspectjtools.jar в папке ant lib, но только в пути к классам проекта. - person Espen; 15.05.2010
comment
В том, как работают загрузчики классов, нет ничего естественного, что вызывает такое поведение. Я ожидал, что ant реализует элемент ‹classpath› как вложенный загрузчик классов, который будет делегировать ant только в том случае, если он не может найти класс. Это позволит проекту переопределять классы в ant / lib /. Я предложу это разработчикам муравьев. - person mchr; 24.05.2010

Окончательный ответ на мой вопрос - нет. В настоящее время ANT не может использовать jar-файл с задачами из проекта вместо jar-файла в каталоге ANT lib.

person mchr    schedule 03.07.2010

Это возможно. Вам нужно использовать эту дополнительную задачу для создания нового загрузчика классов.

http://enitsys.sourceforge.net/ant-classloadertask/

    <!--Append the dependent jars to the classpath so we don't have to install them in the ant directory-->
    <taskdef resource="net/jtools/classloadertask/antlib.xml"
             classpath="${basedir.dir}/lib/ant-classloadertask.jar"/>

    <classloader loader="ant.aspectj.loader" parentloader="project">
        <classpath>
            <pathelement location="${basedir.dir}/lib/aspectjtools.jar"/>
            <pathelement location="${basedir.dir}/lib/ant-classloadertask.jar"/>
        </classpath>
        <antparameters parentfirst="false"/>
        <handler loader="org.apache.tools.ant.AntClassLoader" adapter="org.apache.tools.ant.taskdefs.classloader.adapter.AntClassLoaderAdapter"/>
    </classloader>

    <taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"
             classpath="${basedir.dir}/lib/aspectjtools.jar""
             loaderref="ant.aspectj.loader"/>
person opticyclic    schedule 16.04.2012