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

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

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

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

Gradle config:
Я использую следующие плагины gradle:

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

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

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 все как ожидалось: enter image description here

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

В IntelliJ я активирую обработку аннотации, как предложено документами gradle-apt-plugin: enter image description here

Затем я выполняю ./gradlew clean чтобы убедиться, что предыдущие файлы исчезли, а затем нажмите " Build - Build Project в IntelliJ.
Обработчик аннотации выполняется, но проблема в том, что сгенерированный файл java попадает в неправильное расположение: enter image description here

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

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

Заметки:

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

Ответы

Ответ 1

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

ОБНОВЛЕНИЕ 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)

ORIG ОТВЕТ

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

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

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

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

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

Ответ 2

Теперь https://github.com/tbroyer/gradle-apt-plugin заявляет:

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

Итак:

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'
  }

Ответ 3

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

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

Сначала давайте настроим IntelliJ:

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

enter image description here

  1. Отложите действия IDE на Gradle:

enter image description here

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

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

enter image description here

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

Ура!

Ответ 4

2019.2.x

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

disableAnnotationProcessor

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

build.gradle

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

runGradleTask

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

projectStructure

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