Как скомпилировать процессор аннотаций с помощью Ant?

Вопрос кажется очевидным, но реализация для меня довольно сложная.

Моя цель — написать скрипт сборки Ant для компиляции некоторых классов, для которых требуются другие классы, сгенерированные обработчиком аннотаций. У меня есть пользовательские аннотации и реализация процессора (унаследованная от класса AbstractProcessor).

Как я понимаю нужно:

  1. Скомпилируйте процессор аннотаций
  2. Запустите компилятор над некоторыми аннотированными классами, чтобы сгенерировать новые.
  3. Скомпилируйте классы, которые требуют сгенерированных классов

Код (шаг 1 и 2):


<target name="compileAnnotationProcessor">        
    <javac destdir="${OUTPUT_DIR}"
           debug="true"
           failonerror="true"
           includeantruntime="false"
           classpath="${java.class.path}">
        <src>
            <pathelement path="${PROJECT_DIR}/tools/src"/>
        </src>

        <include name="/path/to/annotation/processor/package/**"/>
    </javac>
</target>

<target name="generateFilesWithAPT" depends="compileAnnotationProcessor">
    <javac destdir="${OUTPUT_DIR}"
           includeantruntime="false"
           listfiles="false"
           fork="true"
           debug="true"
           verbose="true">
        <src>
            <pathelement path="${PROJECT_DIR}/common/src/"/>
        </src>
        <include name="/path/to/files/to/compile/**"/>
        <classpath>
            <pathelement path="${OUTPUT_DIR}"/>
            <pathelement path="${java.class.path}"/>
        </classpath>

        <compilerarg line="-proc:only"/>
        <compilerarg line="-processorpath ${OUTPUT_DIR}/path/to/annotation/processor/package/annProcessorImplement"/>
    </javac>
</target>

На самом деле, первая задача работает хорошо и компилирует файл .class для реализации процессора аннотаций. Останавливается на 2-й задаче.

Муравей говорит: Annotation processing without compilation requested but no processors were found.

Что я делаю неправильно? Может быть, мне следует поместить класс процессора аннотаций в .jar? Или указать имя файла с расширением .class в качестве аргумента -processorpath? Пробовал несколько вариантов, но ничего не помогает..


Примечания:

Я использую ant javac задачу вместо aptone, потому что документация утверждает, что инструмент apt, а также com.sun.mirror API устарели. Я также просмотрел этот вопрос, но информации нет как правильно скомпилировать процессор.

Я использую:

  • Ява 1.6
  • Муравей 1.8.2

person ivstas    schedule 12.10.2012    source источник


Ответы (1)


Мой обычный подход:

  • упаковать аннотацию вместе с обработчиком аннотаций в собственную банку
  • зарегистрируйте процессор аннотаций через META-INF/services в этой банке

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

person Puce    schedule 12.10.2012
comment
Можно ли сделать то же самое, не помещая процессор аннотаций (плюс аннотацию) в .jar? - person ivstas; 12.10.2012
comment
Ну, по крайней мере, процессор аннотаций обычно должен находиться в другой банке, чем классы, которые аннотированы вашей аннотацией, поскольку обработка аннотаций должна быть отключена при компиляции процессоров аннотаций. Вы можете иметь аннотации и обработчики аннотаций в двух отдельных банках, но тогда вам нужно объявить зависимость от них обоих для обработки аннотаций, что, как мне кажется, в большинстве случаев менее удобно. - person Puce; 12.10.2012
comment
Чтобы было ясно, я не имею в виду, что jar должен содержать только аннотации и обработчики аннотаций, но он не должен содержать никаких классов, которые должны обрабатываться обработчиком аннотаций. - person Puce; 12.10.2012
comment
Наконец, я поместил процессор и аннотации в файл .jar и указал путь к файлу .jar в аргументе -processorpath. Это работает, спасибо! - person ivstas; 12.10.2012
comment
Если вы регистрируете процессор через META-INF/services, вам не нужно указывать аргумент пути к процессору. Javac подхватит его автоматически. - person Puce; 12.10.2012