maven-compiler-plugin не выполняет обработку аннотаций, если указано fork = true?

Я использую 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>

Я думал, что тестировал это, но, возможно, я искал вывод консоли (который не появится при разветвлении процесса) вместо того, чтобы искать наличие сгенерированного кода.


person John Q Citizen    schedule 07.10.2014    source источник


Ответы (2)


Чтобы передать параметры -processor для javac, когда он вызывается maven в разветвленном режиме.

person DB5    schedule 07.10.2014
comment
Спасибо ... на самом деле решение требует переноса зависимости процессора из раздела maven-compiler-plugin в раздел dependencies. В остальном опция «-процессор» не действовала. - person John Q Citizen; 08.10.2014
comment
Ах хорошо. Вы можете сделать это официальным ответом и принять его, чтобы любой, у кого возникла такая же проблема, мог легко найти решение (stackoverflow.com/ помощь / самостоятельный ответ). - person DB5; 08.10.2014

Фактически решение заключалось в том, чтобы переместить зависимость процессора из зависимости плагина в нормальные зависимости. См. Edit # 1 в исходном сообщении.

Хотя, как ни странно, я получаю ошибку компиляции, когда зависимость добавляется, а когда зависимость не добавляется. Без зависимости я вижу предупреждение компилятора об использовании внутреннего проприетарного API. Когда добавляется зависимость процессора аннотаций, это предупреждение обрабатывается как ошибка. Я не вижу ни одного параметра -Werror в параметрах компилятора, который рассматривал бы предупреждения как ошибки. Когда зависимость процессора аннотаций удалена, компиляция проходит с предупреждением. Почесывая голову над этим ...

person John Q Citizen    schedule 08.10.2014
comment
У меня та же проблема - у меня есть JAR (artifact apt) = мой обработчик аннотаций, и я использую его в плагине (Mojo в артефакте apt-plugin), который просто запускается Инструмент Javac, использующий этот процессор аннотаций. Я использую его в проекте X. Когда зависимость от apt находится в зависимости проекта, все в порядке. Но когда я просто использую его в плагинах depencies/dependency, это не работает. Модель Maven говорит, что dependencies в plugin ... Дополнительные зависимости, которые этот проект должен ввести в загрузчик классов плагина. Но когда я отлаживаю плагин, он не предлагает моей зависимости ни в каком проекте. Get ... - person virgo47; 14.09.2015