Существует ли какой-либо способ сделать 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 ответов:
Наконец-то я сделал это!
Мне пришлось добавить плагин
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' }
Самый простой способ, который я нашел:
Добавьте
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
, Установите флажок Включить обработку аннотаций, как показано ниже:
Вы должны вручную включить Обработка аннотаций в Интеллидж.
Из: Настройки -- > сборка, выполнение, развертывание -- > компилятор --> процессоры аннотаций--> включить обработку аннотаций и еще Получение процессоров из 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".
Другим решением было бы связать папку с файлами класса сборки, используя блок "зависимости" внутри сборки.грэдл:
Это то, что мне пришлось сделать, чтобы получить идеи для работы с Dagger2 и Gradle.
- включите обработку аннотаций, как показано в ответах выше.
Добавьте следующее в файл
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' }