В части 1 и части 2 и части 3 этой серии, вы были введены в различные темы , связанные с системой сборки платформы NetBeans по Hermien Pellissier , от Saab Systems Grintek в Йоханнесбурге (читать о своей работе платформы NetBeans для национальных сил обороны Южной Африки здесь ) В этой заключительной части она рассказывает о собственном компиляторе Java, который является частью платформы NetBeans, и о том, как компилятор AspectJ может быть включен в работу по разработке платформы NetBeans.
7. О пользовательском компиляторе Java
Во-первых, стоит посмотреть, как исходный код был построен в NetBeans Platform 6.5. Соответствующая часть цели компиляции в «common.xml» показана ниже:
<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>
<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}"/>
</javac>
...
...
...
И как оно построено начиная с 6.7.1:
<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>
<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>
...
...
...
Короче говоря, задача муравья «javac» была заменена на то, что называется «nb-javac». Это определено в цели «-javac-init» (снова показывая только соответствующую часть ниже):
<presetdef>
<custom-javac>
<bootclasspath>
<path path="${bootclasspath.mac}"/>
<path path="${nbjdk.bootclasspath}"/>
</bootclasspath>
<javacclasspath refid="javacimpl"/>
</custom-javac>
</presetdef>
Свойство «nbjdk.bootclasspath» указывает на файл «harness / antlib / openjdk-javac-6-b12.jar», который содержит пользовательский компилятор NetBeans.
Почему этот компилятор существует? Ответ, как я обнаружил совершенно случайно при интеграции компилятора AspectJ (описанного в следующем разделе), прост. Он существует для обработки новых аннотаций, введенных в 6.7.1. Например, аннотация @ServiceProvider обрабатывается этим пользовательским компилятором во время сборки.
8. Интеграция компилятора AspectJ
Многие статьи могут быть написаны только на AspectJ. Однако здесь основное внимание уделяется тому, как создавать код модуля с помощью компилятора AspectJ вместо обычного компилятора Java или пользовательского компилятора NetBeans.
Первый шаг — поместить компилятор AspectJ в папку рядом с папкой Harness в структуре папок вашей платформы. В моей структуре папок это находится в $ {harness.dir} /../ aspectj1.6. Затем просто замените эту часть сценария сборки «common.xml»:
<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>
<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>
с этим:
<target name="compile-aspectj" if="aspectjcompiler">
<property name="cpProperty" refid="cp"/>
<property name="aspectj.lib.dir" location="${harness.dir}/../aspectj1.6/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}" srcdir="${src.dir}" source="${javac.source}" fork="true"
forkclasspath="${aspectjtools.jar}" classpath="${aspectjrt.jar};${cpProperty}"
failonerror="false"/>
</target>
<target name="compile-nb-javac" unless="aspectjcompiler">
<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>
</target>
<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-aspectj" inheritAll="true" />
<antcall target="compile-nb-javac" inheritAll="true" />
Чтобы активировать компилятор AspectJ для определенного модуля, просто определите свойство aspectjcompiler = required в файле «project.properties» модуля.
Однако, поскольку компилятор NetBeans больше не используется, новые аннотации больше не обрабатываются. Лучшим способом было бы скомпилировать файлы Java и Aspect отдельно, а затем сплетать их.
9. Вывод
Сборочный жгут NetBeans Platform отлично справляется со своей задачей и настраивается даже без необходимости изменения сценариев. Знание того, как работает сборка, позволяет разработчику решать проблемы, которые могут возникнуть при использовании сборочной сборки другими способами. Сценарии доступны для модификации, если от этого требуются странные и замечательные вещи, такие как отключение автоматического создания информации об обновлении и замена компилятора Java другим.