Не удается разрешить символ с помощью 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 выполните следующие действия:

  1. Установите конфигурацию обработки аннотации следующим образом:

  2. Запустить меню: Build - Build Project

  3. Щелкните правой кнопкой мыши на каждой новой сгенерированной папке и выберите: Пометить каталог как - Корень сгенерированных источников, чтобы он был помечен следующим образом:

    1. добавлять /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>
Другие вопросы по тегам