2014-10-07 2 views
4

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

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

ответ

1

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

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

+0

Примите этот ответ, если он правильный – softarn

+0

У меня такая же проблема - у меня есть JAR (артефакт ** apt **) = мой обработчик аннотации, и я использую его в плагине (Mojo in artifact ** apt-plugin **) который просто запускает инструмент Javac с использованием этого обработчика аннотаций. Я использую его в проекте X. Когда зависимость от ** apt ** находится в зависимости от проектов, все в порядке. Но когда я просто использую его в плагинах 'depencies/dependency', он не работает. Модель Maven говорит, что «зависимости» в «плагине» ... »Дополнительные зависимости, которые этот проект должен представлять для загрузчика классов плагина». Но когда я отлаживаю плагин, он не предлагает мою зависимость в любом project.get ... – virgo47

1

Вам необходимо использовать опцию compilerArgs, чтобы передать параметры -processor в javac, когда он вызывается maven в раздвоенном режиме.

+0

Спасибо ... на самом деле решение требует перемещения зависимости процессора от раздела «maven-compiler-plugin» и в разделе «зависимости». Опция «-процессор» не имела никакого эффекта. –

+0

Ну ладно. Возможно, вы захотите сделать это официальным ответом и принять его так, чтобы любой, имеющий ту же проблему, мог легко найти решение (http://stackoverflow.com/help/self-answer). – DB5