Существует ли какой-либо способ сделать IntelliJ IDEA распознающим Dagger 2 сгенерированные классы в проекте Java?


Контекст

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

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

Мне удалось сделать пример Google работает на IntelliJ IDEA

Задача

IntelliJ IDEA продолжает говорить мне, что он не может разрешить сгенерированный класс (in этот случай DaggerCoffeeApp_Coffee). Это немного раздражает не знать, если написанный код является правильным (особенно когда вы учитесь использовать Dagger 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 + левый клик)?

6   15  

6 ответов:

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

Мне пришлось добавить плагин 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'
}

Самый простой способ, который я нашел:

  1. Добавьте 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'
    }
    
  2. Включите Annotation Processing для IntelliJ: перейдите к Settings и найдите Annotation Processors, Установите флажок Включить обработку аннотаций, как показано ниже:

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

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

Из: Настройки -- > сборка, выполнение, развертывание -- > компилятор --> процессоры аннотаций--> включить обработку аннотаций и еще Получение процессоров из project classpath

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

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

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

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

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

Файл - > структура проекта - > (выберите свой проект в списке модулей) - > откройте вкладку "зависимости"

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

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

Https://stackoverflow.com/a/22769015/5761849

Это то, что мне пришлось сделать, чтобы получить идеи для работы с 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 (к моей сборке.gradle file), чтобы очистить мой каталог out. Когда я переехал некоторые файлы и Dagger2 восстановил исходные файлы, каталог out не был очищен :(. Я также включил эту задачу в конфигурацию запуска, чтобы она запускалась до того, как я перестрою свой проект.

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