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