Dagger 2, иногда при компиляции я не могу найти класс символов DaggerApplicationComponent

Недавнее обновление Android Studio (2.0.7) (возможно, это причина) иногда при сборке я получаю эту ошибку.

Идея в том, что обычно компиляция проходит хорошо, но иногда я получаю кинжальную ошибку.

Возможно ли, что проблема в конфигурации Dagger?

Сама ошибка:

Executing tasks: [:app:assembleDebug]

Configuration on demand is an incubating feature. Incremental java compilation is an incubating feature. :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE :app:checkDebugManifest :app:preReleaseBuild UP-TO-DATE :app:prepareComAndroidSupportAppcompatV72311Library UP-TO-DATE :app:prepareComAndroidSupportDesign2311Library UP-TO-DATE :app:prepareComAndroidSupportMultidex101Library UP-TO-DATE :app:prepareComAndroidSupportRecyclerviewV72311Library UP-TO-DATE :app:prepareComAndroidSupportSupportV42311Library UP-TO-DATE :app:prepareComDaimajiaSwipelayoutLibrary120Library UP-TO-DATE :app:prepareComF2prateekRxPreferencesRxPreferences101Library UP-TO-DATE :app:prepareComGithubAakiraExpandableLayout141Library UP-TO-DATE :app:prepareComGithubAfollestadMaterialDialogsCore0842Library UP-TO-DATE :app:prepareComGithubCastorflexSmoothprogressbarLibraryCircular120Library UP-TO-DATE :app:prepareComJakewhartonRxbindingRxbinding030Library UP-TO-DATE :app:prepareComPnikosisMaterialishProgress17Library UP-TO-DATE :app:prepareComTrelloRxlifecycle040Library UP-TO-DATE :app:prepareComTrelloRxlifecycleComponents040Library UP-TO-DATE :app:prepareComWdullaerMaterialdatetimepicker211Library UP-TO-DATE :app:prepareIoReactivexRxandroid110Library UP-TO-DATE :app:prepareMeRelexCircleindicator116Library UP-TO-DATE :app:prepareMeZhanghaiAndroidMaterialprogressbarLibrary114Library UP-TO-DATE :app:prepareDebugDependencies :app:compileDebugAidl UP-TO-DATE :app:compileDebugRenderscript UP-TO-DATE :app:generateDebugBuildConfig UP-TO-DATE :app:generateDebugAssets UP-TO-DATE :app:mergeDebugAssets UP-TO-DATE :app:generateDebugResValues UP-TO-DATE :app:generateDebugResources UP-TO-DATE :app:mergeDebugResources UP-TO-DATE :app:processDebugManifest UP-TO-DATE :app:processDebugResources UP-TO-DATE :app:generateDebugSources UP-TO-DATE :app:compileDebugJavaWithJavac /home/ungvas/AndroidDev/Projects/FW/paynet-android/app/src/main/java/md/fusionworks/paynet/ui/activity/BaseActivity.java:23: error: cannot find symbol import md.fusionworks.paynet.di.component.DaggerActivityComponent; ^ symbol: class DaggerActivityComponent location: package md.fusionworks.paynet.di.component /home/ungvas/AndroidDev/Projects/FW/paynet-android/app/src/main/java/md/fusionworks/paynet/PaynetApplication.java:7: error: cannot find symbol import md.fusionworks.paynet.di.component.DaggerApplicationComponent; ^ symbol: class DaggerApplicationComponent location: package md.fusionworks.paynet.di.component 2 errors

Incremental compilation of 66 classes completed in 3.719 secs. :app:compileDebugJavaWithJavac FAILED :app:compileRetrolambdaDebug

FAILURE: Build failed with an exception.

  • What went wrong: Execution failed for task ':app:compileDebugJavaWithJavac'.

    Compilation failed; see the compiler error output for details.

  • Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 19.556 secs
Спасибо.


person user1542447    schedule 25.01.2016    source источник
comment
Вы должны предоставить весь журнал ошибок, так как в большинстве случаев это сопровождается большим количеством ошибок, генерируемых кинжалом, таких как непредоставляемые классы или циклические зависимости,...   -  person David Medenjak    schedule 25.01.2016
comment
Вы используете Gradle 2.10?   -  person pskink    schedule 26.01.2016
comment
какую версию gradle вы используете?   -  person pskink    schedule 26.01.2016
comment
Извините, да, град 2.10))   -  person user1542447    schedule 26.01.2016
comment
у меня то же самое с 2.10, 2.8 работает нормально, но с 2.8 я не могу использовать мгновенный запуск с последним плагином gradle для студии Android (я думаю, что это как-то связано с инкрементной компиляцией)   -  person pskink    schedule 26.01.2016
comment
Спасибо! Хм... интересные ребята из gradle работают над этим вопросом?   -  person user1542447    schedule 26.01.2016
comment
я понятия не имею о зелени...   -  person pskink    schedule 26.01.2016
comment
У меня та же проблема: плагин Gradle 2.10 для Android 2.0.0-alpha7   -  person DanielDiSu    schedule 27.01.2016
comment
кто-нибудь может это исправить? Я пытаюсь запустить github.com/chiuki/android-test-demo и это дает мне ту же ошибку   -  person amadib    schedule 27.03.2016


Ответы (19)


Кажется, это как-то связано с инкрементной компиляцией, добавленной в Gradle 2.10.

Мне удалось это исправить, добавив в gradle следующую команду:

-Pandroid.incrementalJavaCompile=false

Вы можете добавить его в Android Studio в: Файл | Настройки | Сборка, выполнение, развертывание | Компилятор добавляет его как параметр командной строки.

редактировать начиная с 2.0.0-beta3 плагин выдает предупреждение о том, что эта опция была добавлена ​​в Gradle DSL:

android {
    compileOptions.incremental = false
}
person DanielDiSu    schedule 28.01.2016
comment
Привет, это эквивалентно dexOptions{incremental=false}? - person user1542447; 28.01.2016
comment
Инкрементный dex и инкрементная сборка отличаются. Инкрементный dex применяется к процессу создания файла dex, который является этапом, расположенным ниже процесса компиляции от компиляции кода Java. Скомпилированные файлы Java .class на первом этапе затем компилируются в файлы .dex, как описано здесь. И есть немного больше информации в этот вопрос SO. - person neilgmacy; 01.02.2016
comment
Синхронизация не разрешает символ DaggerApplicationComponent, но когда я пытаюсь запустить. Gradle генерирует его автоматически. - person Qamar; 29.03.2017

Изменения в 2017 году:

Android Studio Canary использует более новую версию Gradle, и плагины apt могут не работать, заменены на annotationProcessor. Это может привести к сбою, несмотря на предупреждение компилятора о том, что он будет удален в будущей версии gradle.

Измените эту строку зависимости:

apt 'com.google.dagger:dagger-compiler:2.7'

to

annotationProcessor 'com.google.dagger:dagger-compiler:2.7'

и удалите подходящий плагин.

person Kabliz    schedule 31.08.2017

Вам необходимо обновить версию 2.11 для dagger.

Блок dependencies вашего build.gradle должен выглядеть следующим образом.

dependencies {
    // Other dependencies should go here
    compile "com.google.dagger:dagger:2.11"
    annotationProcessor "com.google.dagger:dagger-compiler:2.11"
    provided 'javax.annotation:jsr250-api:1.0'
    compile 'javax.inject:javax.inject:1'
}

Надеюсь это поможет.

person Hiren Patel    schedule 27.09.2017
comment
@ sud007, не могли бы вы очистить и пересобрать проект? - person Hiren Patel; 30.03.2018
comment
Да приятель! Я уже пробовал большинство решений, упомянутых здесь. Но, как я понял из пары упомянутых здесь ответов, что-то еще может нарушать процесс сборки аннотаций Dagger. Опубликую здесь после решения. - person sud007; 30.03.2018

используйте одну и ту же версию кинжала для всех зависимостей кинжала. работал на меня.

implementation "com.google.dagger:dagger:$daggerVersion"
implementation "com.google.dagger:dagger-android-support:$daggerVersion"
annotationProcessor "com.google.dagger:dagger-android-processor:$daggerVersion"
annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"


//define version in main build.gradle
ext {
    daggerVersion = '2.11'
}
person rajeswari ratala    schedule 30.01.2019
comment
Добавление двух зависимостей посередине устранило эту проблему для меня. Я использую Kotlin, и это единственное исправление. Спасибо. - person Sakiboy; 05.09.2019
comment
Я беру свои слова назад, если вы используете Kotlin (как и я), вам нужно использовать объявление kapt вместо объявлений annotationProcessor. После изменения этого ключевого слова код Dagger2 будет генерироваться и не сломаться через час. - person Sakiboy; 06.09.2019

Я использовал чистый модуль библиотеки Java, но использовал плагин kotlin и зависимости кинжала, например:

build.gradle

apply plugin: 'kotlin'
dependencies {
    implementation "com.google.dagger:dagger:2.22.1"
    kapt "com.google.dagger:dagger-compiler:2.22.1"
}

Ошибка заключалась в том, что я пропустил добавление плагина kotlin-kapt. Итак, мой файл build.gradle получился таким:

apply plugin: 'kotlin'
apply plugin: "kotlin-kapt" // make sure you added this line

dependencies {
    implementation "com.google.dagger:dagger:2.22.1"
    kapt "com.google.dagger:dagger-compiler:2.22.1"
}
person Jorge E. Hernández    schedule 10.04.2019
comment
Я всегда возвращаюсь к этому ответу. Благодарю вас! - person grrigore; 03.03.2021

Последняя версия Dagger (2.8) вызывает эту ошибку. Убедитесь, что ваши зависимости указаны ниже

apt 'com.google.dagger:dagger-compiler:2.7' compile 'com.google.dagger:dagger:2.7'

person fardown    schedule 28.01.2017
comment
В это было трудно поверить, так как раньше он работал с 2.8, но переход на 2.7 действительно действительно сработал для меня. - person Tash Pemhiwa; 02.02.2017

У меня была похожая проблема, но по другой причине.
У меня была проблема только при попытке сгенерировать apk. В противном случае он работал правильно.
В моем случае проблема заключалась в том, что класс по какой-то неизвестной причине находился в каталоге test, а не в каталоге main, я переместил его в основной, и он заработал.
Надеюсь, это кому-то поможет.

person PhpLou    schedule 22.02.2017
comment
В моем случае я изменил имя пакета, содержащего класс, который я пытался использовать, но импорт DaggerXYZ не обновился. - person Dave; 26.07.2017

File->InvalidateCaches/Restart сработало для меня

person D1 and 1ly    schedule 29.11.2017
comment
случилось со мной однажды, и я решил это, аннулировав / перезапустив + перестроив; теперь это случилось во второй раз, и я нашел ошибку в моем java-файле XYZModule, поэтому, возможно, проверьте модули на наличие ошибок, могут быть некоторые - person arenaq; 11.01.2019

Убедитесь, что вы используете Java версии 1.7. Кроме того, если что-то еще сломано в вашем конвейере кинжала, это также вызовет эту ошибку.

person Horatio    schedule 13.11.2016

В моем случае ничего из вышеперечисленного не работает.

Выполните шаги, чтобы создать класс DaggerApplicationComponent.

  1. Чистый проект
  2. Перестроить проект
  3. Импортируйте вручную с помощью Option + Return ИЛИ Alter + Enter, если у вас нет настройки автоматического импорта на лету в Android. студия

Готово

person Hiren Patel    schedule 26.09.2017

Сначала добавьте эту строку в зависимости в скрипте сборки в файле build.gradle проекта.

 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

Во-вторых, добавьте эту строку вверху в файле Module: app build.gradle.

apply plugin: 'com.neenbedankt.android-apt'
person s-hunter    schedule 07.06.2016
comment
У меня есть эти строки, но все равно получаю то же сообщение об ошибке :( - person Hesam; 02.11.2016
comment
android-apt устарел и больше не должен использоваться - person Nino van Hooff; 07.11.2017

У меня была эта проблема, но во время сборки было два сбоя. Один был отсутствующим компонентом, а другой — ButterKnife. @BindView не смог найти представление. Исправление этого исправило отсутствующий компонент. Я предполагаю, что любая неудачная обработка аннотаций вызовет аналогичные проблемы.

person Matt Goodwin    schedule 28.07.2017

Попробуйте запустить приложение, сборка завершится ошибкой, и тогда вы получите возможность импортировать классы. Это происходит потому, что dagger импортирует эти классы только во время выполнения, а не во время компиляции.

person Burhan Shakir    schedule 24.12.2017
comment
Такого не бывает! - person zackygaurav; 24.03.2018

В моем случае в презентаторе я не использовал аннотацию @Inject для переопределенного метода диспетчера данных и т. д.

 @Inject
 public RegisterPresenter(DataManager dataManager, SchedulerProvider 
             schedulerProvider, CompositeDisposable compositeDisposable) {
                super(dataManager, schedulerProvider, compositeDisposable);
}
person Mayuresh Deshmukh    schedule 07.08.2018

Дважды проверьте свои аннотации повсюду на наличие конкретных компонентов и модулей. Моя проблема заключалась в том, что я использовал @Named в модуле, но не определял его в конструкторе.

person Arpit    schedule 12.10.2018

Отметьте это, если вы переходите на Dagger Hilt

Я получал аналогичную ошибку при попытке перенести свое приложение с dagger.android на Dagger Hilt. Похоже, проблема была в несовместимости между версиями библиотек. В итоге я сначала обновил текущую настройку dagger.android до последней версии (2.28), прежде чем начать добавлять и настраивать зависимости Dagger Hilt.

person Seven    schedule 04.08.2020

Вероятно, вы пытаетесь внедрить класс, который не предоставлен. Обычный сценарий — это когда вы предоставляете интерфейс и пытаетесь внедрить конкретный класс.

Например:

@Provides
@Singleton
IConnection getIConnection(){ return new Connection(); }

И пытаюсь внедрить его следующим образом:

@Inject
Connection mConnection;
person Gal Rom    schedule 07.09.2020

В случае, когда я получил эту ошибку, сообщаемая ошибка была неуместной, поскольку сообщалось об ошибке с DaggerMyComponent, но основная причина заключалась в том, что в другом месте кода я по ошибке использовал @BindView ButterKnife. с закрытым членом типа просмотра; исправление этого устранило ошибку.

person aandotherchars    schedule 20.04.2019

Это очень запутанная проблема, с которой я сталкиваюсь! Я понятия не имею, почему это связано с Кинжалом!

Я использую ButterKnife для привязки представлений, но кое-как при кодировании (Спешите скопировать/вставить!) я написал два разных представления с одним и тем же идентификатором, как показано ниже (оба представления с потрясающим идентификатором)

@BindView(R.id.fab)
FloatingActionButton fab;
@BindView(R.id.fab)
Toolbar toolbar;

После попытки запустить приложение выдает эту ошибку на вкладке сборки

Компиляция не удалась; подробности см. в выводе ошибки компилятора.

И ошибка компилятора

ошибка: не удается найти класс символов DaggerApplicationComponent

Я знаю, это кажется смешным, но это случилось со мной, и после исправления идентификаторов моя проблема была решена.

Фиксированный код

@BindView(R.id.fab)
FloatingActionButton fab;
@BindView(R.id.toolbar)
Toolbar toolbar;

Надеюсь помочь кому-нибудь.

ОБНОВЛЕНИЕ

Еще раз это происходит со мной через год, и тот же идентификатор в идентификаторах адаптера RecyclerView

person Radesh    schedule 27.02.2019
comment
Все, что нарушает компиляцию, например. проблемы с масляным ножом, кинжалом, привязкой данных могут выявить другие компоненты, которые также не генерируются, потому что компиляция сломалась, это просто здравый смысл. Вы видите, что отсутствует DaggerApplicationComponent, потому что это первый скомпилированный/сгенерированный класс, который он искал. - person Nick Cardoso; 02.04.2020