Я использую maven-compiler-plugin
в проекте maven для обработки аннотаций в моем коде. Это работало, пока я не добавил <fork>true</fork>
параметр конфигурации.
В файле 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>
Файл my-processor-1.0.jar содержит файл META-INF / services / javax.annotation.processing.Processor, так что он может быть обнаружен компилятором javac
по адресу время выполнения.
Когда я запускаю mvn clean compile с этой конфигурацией, я вижу, что процессор аннотаций работает и сгенерированный код помещается в каталог target \ generated-sources \ annotations, как и ожидалось.
Но если я добавлю параметр <fork>true</fork>
в конфигурацию подключаемого модуля, то я замечу, что обработчик аннотаций не работает и в каталоге target \ generated-sources \ annotations нет кода.
Я пробовал это с 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>
Я думал, что тестировал это, но, возможно, я искал вывод консоли (который не появится при разветвлении процесса) вместо того, чтобы искать наличие сгенерированного кода.