Как переопределить задачу ant, хранящуюся в каталоге ant lib - PullRequest
4 голосов
/ 13 мая 2010

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 03 июля 2010

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

3 голосов
/ 13 мая 2010

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

Невозможно заставить загрузчик классов отдавать предпочтение одному файлу 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>

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

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

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

1 голос
/ 16 апреля 2012

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

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"/>
...