Обработчик аннотации в 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
все как ожидалось:
- Исходный файл
DataEncoding.java
обрабатывается сгенерированным java файлом DataEncodingEnabled.java
в -
/build/generated/source/apt/main
в ожидаемом пакете com.tmtron.immutables.data
- и сгенерированный файл также скомпилирован в файл.class
В IntelliJ я активирую обработку аннотации, как предложено документами gradle-apt-plugin:
Затем я выполняю ./gradlew clean
чтобы убедиться, что предыдущие файлы исчезли, а затем нажмите " Build
- Build Project
в IntelliJ.
Обработчик аннотации выполняется, но проблема в том, что сгенерированный файл java попадает в неправильное расположение:
Он находится в: /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:
- Отключите обработку аннотаций в настройках, поскольку мы собираемся передать все в Gradle:
- Отложите действия IDE на Gradle:
Последний шаг - правильно настроить ваши зависимости в Gradle.
- Раздел "Зависимости" в Gradle:
Теперь вы можете выполнять Build и Run как из командной строки, так и из IDE.
Ура!
Ответ 4
2019.2.x
- Отключить процессор аннотаций intellij
- добавить, построить каталог в вашем файле gradle build.gradle
- затем запустите задачу gradle, чтобы сгенерировать классы файла сборки, например
gradle compileJava
- Файл → Структура проекта → Модули → Основная папка || удалить исключить и добавить в качестве источника
И проект должен найти всю аннотацию и сгенерированный исходный файл. Надеюсь, это поможет.