AspectJ - время компиляции против ткачества во время загрузки

У меня возникли проблемы с пониманием ткачества во время компиляции и загрузки аспектJ и выяснения того, что использовать (и как использовать ajc) для компиляции и сборки моего проекта.

Вот моя структура проекта: -

  • TestProject: сервисная библиотека Java. Это используется в нескольких других проектах. Этот проект не содержит никаких аспектов.

  • TestProject-Aspects: содержит только
    аспекты, которые советуют нескольким классам в TestProject. Я не использую стиль аннотации
    AspectJ5, и все мои точки соединения в настоящее время находятся в режиме выполнения
    метода.

Мои вопросы:

  • ajc vs iajc и чем они разные?
  • Есть ли необходимость в плетении?

  • Будет ли работать что-то подобное?

Скомпилировать TestProject-аспекты

<iajc>
    sourceroots=${sources.dir}
    destdir=${classes.dir}
    classpath=${standard.compile.classpath}
</iajc>

Скомпилировать TestProject

<iajc>
    sourceroots=${sources.dir}
    destdir=${classes.dir}
    classpath=${standard.compile.classpath}
    inpath=${[TestProject-Aspects]pkg.classpath}
</iajc>
  • Разве мне вообще не нужно использовать javac? который я изначально использовал для компиляции TestProject?

person soontobeared    schedule 01.04.2011    source источник


Ответы (1)


ajc и iajc - это расширения компилятора JDT, поставляемого с Eclipse. Итак, ajc и iajc будут генерировать точно такой же байтовый код для чистой Java, как и Eclipse (который содержит некоторые незначительные отличия от Oracle javac).

ajc и iajc в основном одинаковы, за исключением того, что iajc является инкрементным (это i в iajc). Это означает, что компилятор проверяет отметки времени и, если возможно, выполняет более разумную инкрементную сборку и избегает полных сборок (как при использовании AJDT внутри eclipse). Помимо этой функциональности, они по сути одинаковы. Смотрите здесь для получения дополнительной информации:

http://www.eclipse.org/aspectj/doc/released/devguide/antTasks-iajc.html

Если проект не содержит аспектов, использование компилятора ajc необязательно. Эти проекты могут быть на пути к проекту, который содержит аспекты. Для компиляции, содержащей аспекты стиля кода, вам необходимо использовать ajc.

Аспекты стиля аннотации немного отличаются. Если вы используете стиль аннотаций только для LTW, вы можете использовать javac для их компиляции, пока правильный aop.xml создан, weaver доступен во время выполнения.

Однако стиль аннотации с плетением CTW требует ajc.

В вашем конкретном случае, приведенном выше, вы можете скомпилировать TestProject с помощью javac, если он находится во внутреннем пути вашего проекта аспекта. Это будет означать, что файлы классов вашего TestProject будут переписаны и объединены с файлами классов из вашего проекта аспекта.

Или, если вы используете LTW, вам не нужно добавлять свой TestProject ни в какой inpath, и вы можете использовать javac. Но вы должны настроить свое приложение для LTW во время выполнения.


РЕДАКТИРОВАТЬ

Чтобы ответить на ваш комментарий ниже:

да. Вы можете сначала скомпилировать свой проект аспектов, используя задачу ajc или iajc. Затем вы можете скомпилировать второй, чистый java-проект, также используя задачу iajc и, дополнительно, поместив результаты вашего первого проекта в путь аспекта. Вы вообще не можете использовать для этого javac.

Фрагмент ant build.xml будет выглядеть примерно так:

<project name="simple-example" default="compile" >
  <taskdef 
      resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
    <classpath>
      <pathelement location="${home.dir}/tools/aspectj/lib/aspectjtools.jar"/>
    </classpath>
  </taskdef>

  <target name="compile" >
    <iajc sourceroots="${home.dir}/TestProject-Aspects/src" 
        classpath="${home.dir}/tools/aspectj/lib/aspectjrt.jar"
        destDir="${home.dir}/TestProject-Aspects/bin"/> 
    <iajc sourceroots="${home.dir}/TestProject/src" 
        classpath="${home.dir}/tools/aspectj/lib/aspectjrt.jar"
        destDir="${home.dir}/TestProject/bin"
        aspectPath="${home.dir}/TestProject-Aspects/bin"/> 
  </target>
</project>

Подробнее о iajc см. Здесь:

http://www.eclipse.org/aspectj/doc/released/devguide/antTasks-iajc.html

person Andrew Eisenberg    schedule 04.04.2011
comment
Привет, Эндрю, я хотел бы сначала скомпилировать свои аспекты TestProject и использовать его скомпилированные выходные данные для компиляции и сборки моего TestProject. Вы можете сказать мне, как будет выглядеть build.xml в этом сценарии? Могу ли я использовать javac для компиляции моих скомпилированных ajc TestProject-Aspects с TestProject? Спасибо. - person soontobeared; 05.04.2011