Не удается разрешить символ с помощью AutoValue и IntelliJ
Я пытался найти правильные настройки для обработки аннотаций IntelliJ, чтобы она сосуществовала с процессом сборки Gradle.
Всякий раз, когда я строю из IntelliJ, я не могу заставить его распознавать сгенерированные источники из плагина gradle-apt-plugin.
Мои требования для моего проекта:
- Построение между IntelliJ и Gradle должно быть бесшовным и не мешать процессу друг друга
- Мне нужно использовать опцию IntelliJ " Создать отдельный модуль для каждого источника"
- Мне нужно использовать структуру папок IntelliJ
- IntelliJ должен уметь распознавать и автоматически заполнять классы AutoValue
Вот шаги для MCVE, чтобы воспроизвести проблему с IntelliJ 2017.2.4 и Gradle 3.5:
- Создайте новый проект Gradle от IntelliJ
- Установите флажок " Создать отдельный модуль для каждого источника".
- Откройте файл build.gradle:
- Добавьте следующее
plugins
блок:
plugins {
id 'java'
id 'net.ltgt.apt' version '0.12'
}
- Добавьте следующее
dependencies
блок
dependencies {
compileOnly 'com.google.auto.value:auto-value:1.5'
apt 'com.google.auto.value:auto-value:1.5'
}
- Перейдите в Настройки → Построение, Выполнение, Развертывание → Процессоры аннотаций.
- Проверьте включение обработки аннотаций
- Создать класс:
@AutoValue
public abstract class GeneratedSourcesTest {
static GeneratedSourcesTest create(String field) {
return new AutoValue_GeneratedSourcesTest(field);
}
public abstract String field();
}
- На IntelliJ запустите Build → Build Project
- Открой
GeneratedSourcesTest
класс, на статическом методе фабрики, все компилируется нормально, но я получаю ошибку:
cannot resolve symbol ‘AutoValue_GeneratedSourcesTest’
Как я могу сделать AutoValue_GeneratedSourcesTest
класс доступен от IntelliJ?
4 ответа
После импорта вашего проекта Gradle в IDEA выполните следующие действия:
Установите конфигурацию обработки аннотации следующим образом:
Запустить меню: Build - Build Project
Щелкните правой кнопкой мыши на каждой новой сгенерированной папке и выберите: Пометить каталог как - Корень сгенерированных источников, чтобы он был помечен следующим образом:
- добавлять
/generated
в файл проекта .gitignore
- добавлять
Это минимальная жизнеспособная конфигурация, которая обеспечит полную поддержку IDE для сгенерированных классов. Недостатком является то, что всякий раз, когда проект Gradle будет реимпортирован, сгенерированные папки должны быть снова помечены как Root of Generated Sources. Возможно, это можно улучшить, добавив эти пути в качестве исходных наборов в build.gradle.
Иногда случается, что модули IDEA теряют свои настройки пути вывода компилятора в результате вышеизложенного. Достаточно просто установить его обратно в папки по умолчанию.
Ответы (должны быть) в README для плагина gradle-apt: https://github.com/tbroyer/gradle-apt-plugin
А именно, также применить net.ltgt.apt-idea
плагин.
Кстати, я рекомендую делегировать действия по сборке / запуску Gradle в IntelliJ. Конечно, это немного медленнее, но требует нулевой настройки в IDE и работает надежно. Тем не менее, это также должно работать нормально, если вы этого не сделаете.
Просто имейте свой build.gradle с этим, и он работает нормально, не нужно трогать intellij, исходный набор и т.д..
plugins {
id 'java'
id "net.ltgt.apt" version "0.20"
}
apply plugin: 'idea'
apply plugin: 'net.ltgt.apt-idea'
group 'abc'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile "com.google.auto.value:auto-value-annotations:1.6.2"
annotationProcessor "com.google.auto.value:auto-value:1.6.2"
}
Мне не нужно было ничего делать с intellij, используя maven, добавляя необязательный тег true.
<dependency>
<groupId>com.google.auto.value</groupId>
<artifactId>auto-value</artifactId>
<version>1.9</version>
<optional>true</optional>
</dependency>