AspectJ - время компиляции и время загрузки - PullRequest
5 голосов
/ 01 апреля 2011

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

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

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

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

Мои вопросы:

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

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

Компилировать TestProject-Aspect

<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?

1 Ответ

5 голосов
/ 04 апреля 2011

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, ткачиха.

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

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

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


EDIT

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

Да. Вы можете сначала скомпилировать свой проект аспектов, используя 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

...