Я использую maven-compiler-plugin
в проекте maven для выполнения обработки аннотаций на моем коде. Он работал, пока я не добавил параметр конфигурации <fork>true</fork>
.maven-compiler-plugin не обрабатывает аннотации при указании fork = true?
pom.xml файл имеет следующее:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<dependencies>
<!-- Add dependency on the annotation processor -->
<dependency>
<groupId>x.y.z</groupId>
<artifactId>my-processor</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
мой процессор-1.0.jar файл содержит META-INF/услуги/javax.annotation.processing.Processor файл, чтобы он мог быть обнаружен компилятором javac
во время выполнения.
Когда я бегу МВН чистой компиляции с этой конфигурацией, я вижу, что аннотацию процессор работает и сгенерированный код помещается в мишень \ генерируемой Sources \ аннотаций каталог, как и ожидалось.
Но если добавить <fork>true</fork>
вариант конфигурации плагина, то я наблюдаю, что процессор аннотаций не работает, и код не присутствует в мишени \ генерируемых источниках \ аннотаций каталога.
Я пробовал это с помощью maven-compiler-plugin
версии 2.5.1, 3.0 и 3.1 (с версиями 3.x мне пришлось добавить параметр конфигурации <forceJavaCompilerUser>true</forceJavaCompilerUser>
, чтобы можно было обнаружить банку процессора аннотаций).
Я также попытался указать процессор аннотаций явно:
<configuration>
...
<annotationProcessors>
<annotationProcessor>x.y.z.MyProcessor</annotationProcessor>
</annotationProcessors>
...
</configuration>
Опять же, для версии 2.5.1, 3.0, и 3.1, процессор аннотаций будет вызван, если параметр конфигурации не уточнил разветвление. Если указан параметр <fork>true</fork>
, то обработчик аннотации не будет работать.
Я также добавил зависимость x.y.z:my_processor
за пределами зависимости maven-compiler-plugin
, чтобы убедиться, что загружена зависимость процессора аннотаций.
Должна ли обработка аннотации работать, когда maven-compiler-plugin
настроен с <fork>true</fork>
? Или я неправильно настраиваю плагин?
Обратите внимание, что я не хочу, чтобы разделить компиляцию на отдельные казни (например, один выполнение компиляции без обработки аннотаций, используя <fork>true</fork>
и другое исполнение только сделать обработку аннотаций, используя <fork>false</fork>
, начиная со вторым исполнением перекомпилируют весь источник опять же, что плохо при работе с тысячами исходных файлов, если только не существует способа обойти это).
Я использую JDK 1.7.0_45.
Редактировать # 1
На самом деле решение было переместить зависимость процессора из зависимости плагина и в нормальных зависимостей:
<dependencies>
<dependency>
<groupId>x.y.z</groupId>
<artifactId>my-processor</artifactId>
</dependency>
...
</dependencies>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<fork>true</fork>
</configuration>
</plugin>
</plugin>
Я думал, что я испытал это, но я мог бы искал консольный вывод (который не появится, когда процесс разветвляется) вместо того, чтобы искать существование сгенерированного кода.
Примите этот ответ, если он правильный – softarn
У меня такая же проблема - у меня есть JAR (артефакт ** apt **) = мой обработчик аннотации, и я использую его в плагине (Mojo in artifact ** apt-plugin **) который просто запускает инструмент Javac с использованием этого обработчика аннотаций. Я использую его в проекте X. Когда зависимость от ** apt ** находится в зависимости от проектов, все в порядке. Но когда я просто использую его в плагинах 'depencies/dependency', он не работает. Модель Maven говорит, что «зависимости» в «плагине» ... »Дополнительные зависимости, которые этот проект должен представлять для загрузчика классов плагина». Но когда я отлаживаю плагин, он не предлагает мою зависимость в любом project.get ... – virgo47