Разрабатываете ли вы свой проект с использованием платформы NetBeans? Готовы ли вы использовать AspectJ для использования AOP? Вы не знаете, как интегрировать компилятор AspectJ в сборки NetBeans?
Если ваш ответ да, этот пост для вас.
Я решил написать этот технический пост, потому что некоторое время назад я изо всех сил пытался найти это решение, и поэтому я хотел бы поделиться им.
Расскажи историю
Некоторое время назад мне пришлось столкнуться с интеграцией AspectJ в приложение Rich Client Application, реализованное с использованием исходного кода платформы NetBeans. Первое принятое решение состояло в том, чтобы интегрировать AspectJ на уровне компиляции, чтобы создать уже скомпилированный исходный код, содержащий AOP.
Основной вопрос заключался в том, как интегрировать эту пост-компиляцию с файлами компиляции antbeans.
Решение
Прежде всего давайте определим файлы, которые должны быть изменены:
- common.xml: он находится в папке Harness вашей установки NetBeans
- project.properties: модуля, содержащего исходный код, который должен быть скомпилирован с AspectJ
Шаг 1
Загрузите библиотеки AspectJ и поместите их в папку, расположенную в папке «harness» вашей установки NetBeans. Допустим, эта папка называется: aspectj-xxx / lib.
Шаг 2
Зайдите в модуль, который содержит исходный код для компиляции с AspectJ и добавьте следующую строку в его файл project.properties (в важных файлах):
|
1
|
aspectjcompiler=required |
Шаг 3
Теперь пришло время настроить файл common.xml. Именно здесь на самом деле находится цель ant, вызываемая IDE NetBeans при запуске действия сборки.
Этот пример сделан с использованием NetBeans 7.3.1, но для предыдущих или будущих изменений различия незначительны. Модификации выделены синим цветом.
Измените целевой компилятор следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<target name=”compile-nb-javac” depends=”init,up-to-date” unless=”is.jar.uptodate”><mkdir dir=”${build.classes.dir}”/><depend srcdir=”${src.dir}” destdir=”${build.classes.dir}” cache=”${build.dir}/depcache”><classpath refid=”cp”/></depend><nb-javac srcdir=”${src.dir}” destdir=”${build.classes.dir}” debug=”${build.compiler.debug}” debuglevel=”${build.compiler.debuglevel}” encoding=”UTF-8″deprecation=”${build.compiler.deprecation}” optimize=”${build.compiler.optimize}” source=”${javac.source}” target=”${javac.target}” includeantruntime=”false”><classpath refid=”cp”/><compilerarg line=”${javac.compilerargs}”/><processorpath refid=”processor.cp”/></nb-javac><copy todir=”${build.classes.dir}”><fileset dir=”${src.dir}” excludes=”${jar-excludes}”/></copy></target> |
Добавьте новую целевую компиляцию следующим образом:
|
1
2
3
4
5
6
7
8
|
<target name=”compile” depends=”init,up-to-date” unless=”is.jar.uptodate”><mkdir dir=”${build.classes.dir}”/><depend srcdir=”${src.dir}” destdir=”${build.classes.dir}” cache=”build/depcache”><classpath refid=”cp”/></depend><antcall target=”compile-nb-javac” inheritAll=”true” /><antcall target=”compile-aspectj” inheritAll=”true” /></target> |
Добавьте новый целевой compile-aspectj следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
<target name=”compile-aspectj” depends=”init,up-to-date” unless=”is.jar.uptodate” if=”aspectjcompiler”><property name=”cpProperty” refid=”cp”/><property name=”aspectj.lib.dir” location=”${harness.dir}/aspectj-x.x.x/lib”/><property name=”aspectjtools.jar” location=”${aspectj.lib.dir}/aspectjtools.jar”/><property name=”aspectjrt.jar” location=”${aspectj.lib.dir}/aspectjrt.jar”/><taskdef resource=”org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties”><classpath><pathelement path=”${aspectjtools.jar}”/></classpath></taskdef><iajc destdir=”${build.classes.dir}” source=”${javac.source}” fork=”true”forkclasspath=”${aspectjtools.jar}” classpath=”${aspectjrt.jar};${cpProperty}”failonerror=”false” ><sourceroots><pathelement location=”${src.dir}”/></sourceroots></iajc></target> |
Вывод
Теперь, когда вы выполните очистку и сборку, вы увидите, что исходный код выбранного модуля скомпилирован с использованием компилятора aspectj сразу после обычной компиляции.
Все, что вам нужно, это убедиться, что аспект и исходный код, которые должны быть скомпилированы с ним, находятся в одном модуле.