Обработчик аннотаций в IntelliJ и Gradle

tl; dr: я не могу настроить IntelliJ для создания файлов java в том же каталоге, что и gradle.

У меня есть небольшой проект, в котором используется процессор аннотаций immutables. Он работает должным образом в сборке командной строки gradle, но я не могу заставить IntelliJ выводить сгенерированные файлы в тот же каталог.

Полный проект доступен на GitLab.

Конфигурация Gradle:
Я использую следующие плагины Gradle:

  • плагин gradle-idea, который обрабатывает конфигурацию идеи.
  • gradle-apt-plugin, который предоставляет подходящую конфигурацию и обрабатывает путь и идею класса компиляции. конфигурация, относящаяся к обработке аннотаций (если также применяется плагин идеи)

соответствующие части скрипта сборки (ссылка на полный список ):

apply plugin: 'java'
apply plugin: "net.ltgt.apt"
apply plugin: 'idea'

dependencies {
    def immutablesVersion = '2.3.9'
    compileOnly "org.immutables:value:$immutablesVersion:annotations"
    compileOnly "org.immutables:encode:$immutablesVersion"
    apt "org.immutables:value:$immutablesVersion"
}

когда я начинаю ./gradlew build, все как ожидалось:  введите описание изображения здесь

  1. Исходный файл DataEncoding.java обрабатывается, и сгенерированный java-файл DataEncodingEnabled.java попадает в
  2. /build/generated/source/apt/main под ожидаемым пакетом com.tmtron.immutables.data
  3. и сгенерированный файл также компилируется в файл .class

В IntelliJ я активирую обработку аннотаций в соответствии с рекомендациями gradle-apt-plugin docs:  введите описание изображения здесь

Затем я выполняю ./gradlew clean, чтобы убедиться, что предыдущие файлы исчезли, а затем нажимаю Build - Build Project в IntelliJ.
Обработчик аннотаций выполняется, но проблема в том, что сгенерированный файл java оказывается в неправильном месте: < a href = "https://i.stack.imgur.com/bSSEx.png" rel = "noreferrer">   введите описание изображения здесь

Он находится в: /build/generated/source/apt/main/<▪build/generated/source/apt/mainжирная часть избыточна.

Что я делаю не так и как я могу его правильно настроить, чтобы IntelliJ и gradle генерировали файлы в одном каталоге?

Примечания:

  • Я, конечно, уже пытался просто оставить «Каталог исходных кодов производства» в конфигурации аннотации IntelliJ пустым, но он не работает: тогда он автоматически использует «сгенерированный», и я также получаю неправильный путь.
  • IntelliJ версии 2016.3.4

person TmTron    schedule 24.02.2017    source источник


Ответы (4)


Теперь в https://github.com/tbroyer/gradle-apt-plugin говорится:

Цель этого плагина заключалась в том, чтобы в конечном итоге больше не понадобиться, и его заменили встроенные функции. Это становится реальностью с Gradle 5.2 и IntelliJ IDEA 2019.1.

So:

dependencies {
  compile("com.google.dagger:dagger:2.18")
  annotationProcessor("com.google.dagger:dagger-compiler:2.18")

  compileOnly("com.google.auto.factory:auto-factory:1.0-beta6")
  annotationProcessor("com.google.auto.factory:auto-factory:1.0-beta6")

  compileOnly("org.immutables:value-annotations:2.7.1")
  annotationProcessor("org.immutables:value:2.7.1")
}

compileOnly необходимо, если вы используете аннотации, compile, если вы используете классы, annotationProcessor представленные в Gradle 4.6.

Чтобы разрешить обработку конкретной задачи компиляции:

compileJava {
    options.annotationProcessorPath = configurations.annotationProcessor
}

Отключить:

  compileTestJava {
      options.compilerArgs += '-proc:none'
  }
person gavenkoa    schedule 09.02.2019
comment
А как насчет конфигурации IntelliJ в 2019.1? Следует ли мне удалить обработчик аннотаций? - person de.la.ru; 09.04.2019

ОБНОВЛЕНИЕ 2.2019
начиная с Gradle 5.2 есть простой способ сделать это - см. gavenkoa s ответ

ОБНОВЛЕНИЕ 5.2018

Я знаю самый простой способ - использовать плагин apt-idea.

Просто активируйте плагин в build.gradle файле:

plugins {
    id 'java'
    id 'net.ltgt.apt-idea' version "0.15"
}

а затем добавьте обработчики аннотаций в конфигурацию annotationProcessor:

final DAGGER_VER = '2.16'
dependencies {
    implementation "com.google.dagger:dagger:${DAGGER_VER}"
    annotationProcessor"com.google.dagger:dagger-compiler:${DAGGER_VER}"
}

Тестовый проект на GitHub: ex.dagger
(с использованием IntelliJ 2018.1.4, Gradle 4.7 )

ИСХОДНЫЙ ОТВЕТ

Существует простой обходной путь с использованием родительского каталога, который отлично работает в IntelliJ 2016.3.4.

  • Каталог источников продукции: ../main
  • Каталог исходных текстов тестов: ../test

Теперь gradle и IntelliJ сгенерируют код в одних и тех же каталогах.

Исправлено в проекте GitLab V0.0.2

см. также: проблема с плагином apt-gradle № 35

person TmTron    schedule 25.02.2017

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

Также мой IntelliJ - это 2019.1 (обновите ваш, если он старше) и Gradle 5.2.1.

Сначала настроим IntelliJ:

  1. Отключите обработку аннотаций в настройках, так как мы собираемся делегировать все в Gradle:

введите описание изображения здесь

  1. Удалить действия IDE в Gradle:

введите описание изображения здесь

Последний шаг - правильно настроить ваши зависимости в Gradle.

  1. Раздел зависимостей в Gradle:

введите описание изображения здесь

Теперь вы можете выполнять сборку и запуск как из командной строки, так и из IDE.

Ваше здоровье!

person de.la.ru    schedule 10.04.2019
comment
Очень полезно, так как решило мою проблему сборки проекта JHipster. - person abiieez; 05.05.2019
comment
Спасибо за публикацию. - person GBP; 16.01.2020

2019.2.x

  • Отключить обработчик аннотаций intellij

disableAnnotationProcessor

  • добавить, построить каталог в вашем файле gradle build.gradle

build.gradle

  • затем запустите задачу gradle, чтобы сгенерировать классы файлов сборки, например gradle compileJava

runGradleTask

  • Файл -> Структура проекта -> Модули -> Основная папка || удалить исключить и добавить как источник

projectStructure

И проект должен найти все аннотации и сгенерированный исходный файл. Надеюсь, это поможет.

person Shakil    schedule 28.08.2019