Настройка обработки аннотаций в Java 6 с помощью Ant - PullRequest
18 голосов
/ 05 сентября 2010

У меня есть пользовательская аннотация, и это процессор и процессор завода.Как настроить файл сборки Ant таким образом:

  1. Обработчик аннотаций применяется к аннотированным классам и генерирует исходные файлы в папке «gen»

  2. Сгенерированные исходные файлы (из обработки аннотаций) могут использоваться другими исходными файлами в проекте.

Ответы [ 4 ]

11 голосов
/ 05 сентября 2010

Это не красиво, но это то, что я делаю.(Источники Задача javac ant Страница man javac ) Используя атрибут compilerarg, я могу передать аргументы, связанные с обработкой аннотаций, которые напрямую не поддерживаются задачей javac ant.

<javac srcdir="${src}" destdir="${classes}" ... > 
     ....
     <compilerarg line="-processorpath ${processorpath}"/>
     <compilerarg line="-processor ${processor}"/>
     <compilerarg line="-s ${whereToPutGeneratedClassFiles}"/>
</javac>

Я не использую APT tool , потому что документация гласит

Имейте в виду, что инструмент Apt действительно является нестабильной частью инфраструктуры JDK, поэтому можетрадикально изменить в будущих версиях.В частности, он, вероятно, устарел в JDK 6, который может запускать процессоры аннотаций как часть javac.

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

<jar destfile="${annotationprocessorjar}" ... >
     ...
     <service type="javax.annotation.processing.Processor" provider="${your.annotation.processor.fully.qualified.name}"/>
</jar>

Тогда вы можете сделать

 <javac ... make sure ${annotationprocessorjar} is in classpath>
 </javac>
2 голосов
/ 02 августа 2013

Я обнаружил, что некоторые другие примеры слегка сбивают с толку из-за того, что некоторые биты ключа являются необъяснимыми переменными. Вот что я закончил:

для сборки банки с процессором:

<target name="build-aux">
    <mkdir dir="${build.dir}" />
    <mkdir dir="${build.classes}" />
    <javac destdir="${build.classes}" source="1.6" target="1.6">
        <src path="${src.java}" />
        <include name="com/acme/cli/Program.java" />
        <include name="com/acme/cli/ProgramProcessor.java" />
    </javac>

    <jar jarfile="acme-aux.jar" update="true">
        <manifest>
            <attribute name="Main-Class" value="${main.class}" />
            <attribute name="Implementation-Title" value="acme-aux" />
            <attribute name="Implementation-Version" value="${version}" />
            <attribute name="Implementation-Vendor" value="ACME, Inc" />
            <attribute name="Built-By" value="${user.name}" />
            <attribute name="Build-Date" value="${TODAY}" />
        </manifest>
        <fileset dir="${build.classes}">
            <!-- the annotation -->
            <include name="com/acme/cli/Program.class" />
            <!-- the annotation processor -->
            <include name="com/acme/cli/ProgramProcessor.class" />
        </fileset>
        <service type="javax.annotation.processing.Processor"
            provider="com.acme.cli.ProgramProcessor" />
    </jar>
</target>

затем скомпилировать код и запустить процессор:

<target name="compile" depends="generate,build-aux">
    <mkdir dir="${build.dir}" />
    <mkdir dir="${build.classes}" />
    <javac destdir="${build.classes}" source="1.6" target="1.6">
        <src path="${src.java}" />
        <include name="com/acme/**/*.java" />
        <!-- ensure that "acme-aux.jar" is in this classpath -->
        <classpath refid="compile.class.path"/>
         <!-- pass option to annotation processor -->
        <compilerarg value="-Aacme.version=${version}" />
    </javac>
</target>
1 голос
/ 06 декабря 2010

Вот как я это сделал в eclipse / ant:

<javac destdir="bin"
  debug="true"
  debuglevel="${debuglevel}"
  compiler="javac1.6"
  srcdir="${src}">
       <include name="**/*.java"/> <!-- I just do it this way -->
 <classpath refid="classpath_ref_id"/>
 <compilerarg value="-processor" />
 <compilerarg value="${processor}" />
 <compilerarg value="-s" />
 <compilerarg value="${gen_src_target}" />
</javac>

Примечания

  • Путь к процессору включен в * classpath_ref_id *
  • Запустите ваш процессор до вас скомпилировать фактический код (с помощью или без сгенерированного кода).
0 голосов
/ 05 сентября 2010

вы можете взглянуть на инструмент для обработки аннотаций , он автоматически компилирует сгенерированные исходные файлы

// EDIT // В ответ на ваш комментарий:

Вы можете использовать apt в сочетании с заданием apt ant

Но с jdk6 инструмент javac обеспечивает прямую поддержку обработки аннотаций , поэтому вы должны иметь возможность использовать задачу javac ant с атрибутом компилятора, указанным как "javac1.6 «

...