Есть ли способ сделать IntelliJ IDEA распознаванием порожденных классов Dagger 2 в проекте Java?

Контекст

Я начал собственный проект в java с Gradle в качестве системы сборки, и я хочу использовать Dagger 2 как DI. Основная причина заключается в том, чтобы привыкнуть к этой библиотеке и иметь возможность легко использовать ее в больших проектах.

Что я пробовал

Мне удалось сделать образец Google для IntelliJ IDEA

Проблема

IntelliJ IDEA продолжает говорить мне, что он не может разрешить сгенерированный класс (в данном случае DaggerCoffeeApp_Coffee). Это немного раздражает, чтобы не знать, правильно ли написанный код (особенно когда вы учитесь использовать Кинжал 2).

Все классы java совпадают с Google. Вот мой файл build.gradle:

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile 'com.google.dagger:dagger:2.0.1'
    compile 'com.google.dagger:dagger-compiler:2.0.1'
}

Вопрос

Есть ли способ сделать IntelliJ IDEA распознать DaggerCoffeeApp_Coffee как сгенерированный класс (и, таким образом, можно перейти к его реализации с помощью `ctrl + left click)?

Ответ 1

Наконец, я сделал это!

Мне пришлось добавить плагин apt и idea, так что теперь мой файл build.gradle выглядит следующим образом:

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "net.ltgt.gradle:gradle-apt-plugin:0.4"
    }
}

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

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile 'com.google.dagger:dagger:2.0.1'
    apt 'com.google.dagger:dagger-compiler:2.0.1'
}

Ответ 2

Самый простой способ:

  • Добавьте плагин idea и добавьте зависимость Dagger2, как показано ниже:

    plugins {
        id "net.ltgt.apt" version "0.10"
    }
    
    apply plugin: 'java'
    apply plugin: 'idea'
    
    sourceCompatibility = 1.8
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
    
        compile 'com.google.dagger:dagger:2.11'
        apt 'com.google.dagger:dagger-compiler:2.11'
    }
    
  • Включите Annotation Processing для IntelliJ: перейдите в Settings и выполните поиск Annotation Processors, установите флажок Включить обработку аннотации, как показано ниже:

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

Ответ 3

Вы должны вручную включить обработку аннотаций в IntelliJ.

От: Настройки → Построение, Выполнение, Развертывание → Компилятор → Процессоры аннотаций → Включить обработку аннотаций и Получить процессоры из пути к классам проекта

затем пересоберите проект, и вы найдете сгенерированные классы в проекте.

Обратите внимание, что я использовал это решение в (Java) проекте Android.

Ответ 4

Я использую версию 2017.3.3 для IntelliJ IDEA, версию 0.14 плагина net.ltgt.apt и версию 2.14.1 кинжала, а также использование плагина idea в файле build.gradle (as в Pelocho answer) Я обнаружил, что мне также пришлось сообщить IntelliJ, где он может найти источники, созданные кинжалом, следующим образом:

apply plugin: 'idea'
idea {
    module {
        sourceDirs += file("$buildDir/generated/source/apt/main")
        testSourceDirs += file("$buildDir/generated/source/apt/test")
    }
}

Ответ 5

Вот решение, которое сработало для меня:

Файл → Структура проекта → (выберите проект под списком модулей) → Откройте вкладку "Зависимости"

Затем щелкните зеленый знак "+", выберите "JARs или каталог" и выберите папку "build/classes/main".

Другим решением было бы связать папку с файлами класса сборки, используя блок "dependencies" внутри build.gradle:

fooobar.com/questions/331103/...

Ответ 6

Это то, что я должен был сделать, чтобы заставить Idea работать с Dagger2 и Gradle.

  1. Включите обработку аннотаций, как показано в ответах выше.
  2. Добавьте следующее в файл build.gradle чтобы Idea увидела сгенерированные классы в качестве источников.

    sourceDirs += file("$projectDir/out/production/classes/generated/")
    

Здесь полный список моих build.gradle

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

idea {
    module {
        sourceDirs += file("$projectDir/out/production/classes/generated/")
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.dagger:dagger:2.16'
    apt 'com.google.dagger:dagger-compiler:2.16'
}

sourceCompatibility = 1.8

Кроме того, мне пришлось добавить следующую задачу gradle (в мой файл build.gradle), чтобы очистить мой каталог out. Когда я переместил некоторые файлы и Dagger2 сгенерировал исходные файлы, каталог out не был очищен :(. Я также включил эту задачу в свою конфигурацию запуска, чтобы она запускалась до того, как я перестроил свой проект.

task clearOutFolder(type: Delete) {
    delete 'out'
}

Ответ 7

Используя IntelliJ IDEA 2019.1 и Gradle 5.4.1, этого кажется достаточно:

plugins {
    id 'java'
}

version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testImplementation group: 'junit', name: 'junit', version: '4.12'

    implementation 'com.google.dagger:dagger:2.23.1'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.23.1'
}

Я не знаю минимальные версии, для которых это решение работает, хотя.

Ответ 8

У меня была похожая проблема, я долго не мог найти причину.

Просто запустил и результат меня удивил. IDE displays an error Intellij Idea 2018.3.6 - build.gradle:

plugins {
    id "java"
}
sourceCompatibility = 1.8
repositories {
    mavenCentral()
}
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile 'com.google.dagger:dagger:2.11'
    apt 'com.google.dagger:dagger-compiler:2.11'
}