Dagger: Dagger 2.12 -> runtime error when injecting application

Created on 11 Oct 2017  Â·  13Comments  Â·  Source: google/dagger

After upgrading to 2.12 my android app crashes on startup with following stacktrace:

Failed resolution of: Lcom/google/common/collect/ImmutableMap;
   at com.bejibx.android.mplaya.application.di.DaggerApplicationComponent.injectPlayerApplication(DaggerApplicationComponent.java:356)
   at com.bejibx.android.mplaya.application.di.DaggerApplicationComponent.inject(DaggerApplicationComponent.java:342)
   at com.bejibx.android.mplaya.application.di.DaggerApplicationComponent.inject(DaggerApplicationComponent.java:179)
   at dagger.android.DaggerApplication.injectIfNecessary(DaggerApplication.java:78)
   at dagger.android.DaggerApplication.onCreate(DaggerApplication.java:53)
   at com.bejibx.android.mplaya.application.PlayerApplication.onCreate(PlayerApplication.java:33)
   at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1014)
   at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4806)
   at android.app.ActivityThread.access$1600(ActivityThread.java:154)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1452)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:234)
   at android.app.ActivityThread.main(ActivityThread.java:5526)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.common.collect.ImmutableMap" on path: DexPathList[[zip file "/data/app/ru.bejibx.player-2/base.apk"],nativeLibraryDirectories=[/data/app/ru.bejibx.player-2/lib/arm, /vendor/lib, /system/lib]]
   at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
   at com.bejibx.android.mplaya.application.di.DaggerApplicationComponent.injectPlayerApplication(DaggerApplicationComponent.java:356) 
   at com.bejibx.android.mplaya.application.di.DaggerApplicationComponent.inject(DaggerApplicationComponent.java:342) 
   at com.bejibx.android.mplaya.application.di.DaggerApplicationComponent.inject(DaggerApplicationComponent.java:179) 
   at dagger.android.DaggerApplication.injectIfNecessary(DaggerApplication.java:78) 
   at dagger.android.DaggerApplication.onCreate(DaggerApplication.java:53) 
   at com.bejibx.android.mplaya.application.PlayerApplication.onCreate(PlayerApplication.java:33) 
   at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1014) 
   at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4806) 
   at android.app.ActivityThread.access$1600(ActivityThread.java:154) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1452) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:234) 
   at android.app.ActivityThread.main(ActivityThread.java:5526) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Suppressed: java.lang.ClassNotFoundException: com.google.common.collect.ImmutableMap
   at java.lang.Class.classForName(Native Method)
   at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
   at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
        ... 17 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

Probably because of

If you have Guava on your classpath, these will be implemented using ImmutableSet/ImmutableMap too

But I'm pretty sure I do not have guava on my classpath. Here is my dependencies list:

gradlew app:dependencies --configuration compile

+--- org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.50
|    \--- org.jetbrains.kotlin:kotlin-stdlib:1.1.50
|         \--- org.jetbrains:annotations:13.0
+--- com.android.support:support-annotations:26.0.2
+--- com.android.support:design:26.0.2
|    +--- com.android.support:support-v4:26.0.2
|    |    +--- com.android.support:support-compat:26.0.2
|    |    |    \--- com.android.support:support-annotations:26.0.2
|    |    +--- com.android.support:support-media-compat:26.0.2
|    |    |    +--- com.android.support:support-annotations:26.0.2
|    |    |    \--- com.android.support:support-compat:26.0.2 (*)
|    |    +--- com.android.support:support-core-utils:26.0.2
|    |    |    +--- com.android.support:support-annotations:26.0.2
|    |    |    \--- com.android.support:support-compat:26.0.2 (*)
|    |    +--- com.android.support:support-core-ui:26.0.2
|    |    |    +--- com.android.support:support-annotations:26.0.2
|    |    |    \--- com.android.support:support-compat:26.0.2 (*)
|    |    \--- com.android.support:support-fragment:26.0.2
|    |         +--- com.android.support:support-compat:26.0.2 (*)
|    |         +--- com.android.support:support-core-ui:26.0.2 (*)
|    |         \--- com.android.support:support-core-utils:26.0.2 (*)
|    +--- com.android.support:appcompat-v7:26.0.2
|    |    +--- com.android.support:support-annotations:26.0.2
|    |    +--- com.android.support:support-v4:26.0.2 (*)
|    |    +--- com.android.support:support-vector-drawable:26.0.2
|    |    |    +--- com.android.support:support-annotations:26.0.2
|    |    |    \--- com.android.support:support-compat:26.0.2 (*)
|    |    \--- com.android.support:animated-vector-drawable:26.0.2
|    |         +--- com.android.support:support-vector-drawable:26.0.2 (*)
|    |         \--- com.android.support:support-core-ui:26.0.2 (*)
|    +--- com.android.support:recyclerview-v7:26.0.2
|    |    +--- com.android.support:support-annotations:26.0.2
|    |    +--- com.android.support:support-compat:26.0.2 (*)
|    |    \--- com.android.support:support-core-ui:26.0.2 (*)
|    \--- com.android.support:transition:26.0.2
|         +--- com.android.support:support-annotations:26.0.2
|         \--- com.android.support:support-v4:26.0.2 (*)
+--- com.android.support:mediarouter-v7:26.0.2
|    +--- com.android.support:appcompat-v7:26.0.2 (*)
|    \--- com.android.support:palette-v7:26.0.2
|         +--- com.android.support:support-compat:26.0.2 (*)
|         \--- com.android.support:support-core-utils:26.0.2 (*)
+--- com.android.support:cardview-v7:26.0.2
|    \--- com.android.support:support-annotations:26.0.2
+--- com.android.support:support-v13:26.0.2
|    +--- com.android.support:support-annotations:26.0.2
|    \--- com.android.support:support-v4:26.0.2 (*)
+--- com.android.support.constraint:constraint-layout:1.0.2
|    \--- com.android.support.constraint:constraint-layout-solver:1.0.2
+--- com.google.dagger:dagger-android:2.12
|    +--- com.google.dagger:dagger:2.12
|    |    \--- javax.inject:javax.inject:1
|    +--- com.android.support:support-annotations:25.0.0 -> 26.0.2
|    +--- com.google.code.findbugs:jsr305:3.0.1
|    \--- javax.inject:javax.inject:1
+--- com.google.dagger:dagger-android-support:2.12
|    +--- com.google.dagger:dagger:2.12 (*)
|    +--- com.google.dagger:dagger-android:2.12 (*)
|    +--- com.android.support:appcompat-v7:25.0.0 -> 26.0.2 (*)
|    +--- com.android.support:support-annotations:25.0.0 -> 26.0.2
|    +--- com.android.support:support-v4:25.0.0 -> 26.0.2 (*)
|    +--- com.google.code.findbugs:jsr305:3.0.1
|    \--- javax.inject:javax.inject:1
+--- com.jakewharton:butterknife:8.8.1
|    +--- com.jakewharton:butterknife-annotations:8.8.1
|    |    \--- com.android.support:support-annotations:25.3.0 -> 26.0.2
|    +--- com.android.support:support-annotations:25.3.0 -> 26.0.2
|    \--- com.android.support:support-compat:25.3.0 -> 26.0.2 (*)
+--- com.github.bumptech.glide:glide:4.2.0
|    +--- com.github.bumptech.glide:gifdecoder:4.2.0
|    |    \--- com.android.support:support-annotations:26.0.2
|    +--- com.github.bumptech.glide:disklrucache:4.2.0
|    \--- com.github.bumptech.glide:annotations:4.2.0
+--- com.arello-mobile:moxy:1.5.3
+--- frankiesardo:icepick:3.2.0
+--- io.reactivex.rxjava2:rxjava:2.1.5
|    \--- org.reactivestreams:reactive-streams:1.0.1
+--- io.reactivex.rxjava2:rxandroid:2.0.1
|    \--- io.reactivex.rxjava2:rxjava:2.0.1 -> 2.1.5 (*)
+--- com.afollestad.material-dialogs:core:0.9.4.7
|    +--- com.android.support:support-annotations:26.0.1 -> 26.0.2
|    +--- com.android.support:support-v13:26.0.1 -> 26.0.2 (*)
|    +--- com.android.support:appcompat-v7:26.0.1 -> 26.0.2 (*)
|    +--- com.android.support:recyclerview-v7:26.0.1 -> 26.0.2 (*)
|    \--- me.zhanghai.android.materialprogressbar:library:1.4.1
|         +--- com.android.support:appcompat-v7:25.3.1 -> 26.0.2 (*)
|         \--- com.android.support:support-annotations:25.3.1 -> 26.0.2
+--- com.google.code.gson:gson:2.8.2
+--- com.google.android.exoplayer:exoplayer-core:r2.5.3
|    \--- com.android.support:support-annotations:25.4.0 -> 26.0.2
+--- com.annimon:stream:1.1.9
+--- ru.terrakok.cicerone:cicerone:2.1.0
+--- com.jakewharton.timber:timber:4.5.1
+--- eu.davidea:flexible-adapter:5.0.0-rc2
+--- nz.bradcampbell:paperparcel:2.0.4
|    +--- nz.bradcampbell:paperparcel-api:2.0.4
|    |    \--- com.android.support:support-annotations:25.0.1 -> 26.0.2
|    \--- com.android.support:support-annotations:25.0.1 -> 26.0.2
+--- nz.bradcampbell:paperparcel-kotlin:2.0.4
\--- com.bluelinelabs:conductor:2.1.4
     \--- com.android.support:support-annotations:25.3.1 -> 26.0.2

Most helpful comment

hi guys,
I fix this issue on my project with following config.

dependencies {
...
api 'org.checkerframework:checker-compat-qual:2.5.3'
api 'com.google.guava:guava:26.0-android'
...
}

All 13 comments

If you didn't have Guava on your classpath, then this would fail compilation...

Oh shoot, maybe the issue is that the Android Gradle Plugin uses Guava, and we're detecting that? I still don't see how that wouldn't break your compilation though

Maybe a compileOnly/provided dependency?

Indeed, provided configuration has guava on classpath.

gradlew app:dependencies --configuration provided

+--- com.google.auto.value:auto-value:1.5
+--- com.ryanharter.auto.value:auto-value-gson:0.6.0
|    +--- com.ryanharter.auto.value:auto-value-gson-annotations:0.6.0
|    +--- com.google.code.gson:gson:2.8.1
|    +--- com.google.auto.value:auto-value:1.4.1 -> 1.5
|    +--- com.google.auto:auto-common:0.8
|    |    \--- com.google.guava:guava:19.0
|    \--- com.squareup:javapoet:1.9.0
+--- javax.annotation:jsr250-api:1.0
\--- frankiesardo:icepick-processor:3.2.0
     +--- org.clojure:clojure:1.7.0
     +--- frankiesardo:icepick:3.2.0
     +--- com.google.auto.service:auto-service:1.0-rc2
     |    +--- com.google.auto:auto-common:0.3 -> 0.8 (*)
     |    \--- com.google.guava:guava:18.0 -> 19.0
     \--- stencil:stencil:0.3.5
          +--- org.clojure:clojure:1.3.0 -> 1.7.0
          +--- scout:scout:0.1.0
          |    \--- org.clojure:clojure:1.3.0 -> 1.7.0
          +--- quoin:quoin:0.1.2
          |    \--- org.clojure:clojure:1.3.0 -> 1.7.0
          +--- slingshot:slingshot:0.10.3
          |    \--- org.clojure:clojure:1.2.1 -> 1.7.0
          \--- org.clojure:core.cache:0.6.3
               +--- org.clojure:data.priority-map:0.0.2
               |    \--- org.clojure:clojure:1.3.0 -> 1.7.0
               \--- org.clojure:clojure:1.4.0 -> 1.7.0

But I thought provided dependencies only needed during compile time and doesn't went into application package, isn't it?

icepick-processor should be on the annotationProcessor configuration and
not provided.

On Wed, Oct 11, 2017 at 11:13 AM bejibx notifications@github.com wrote:

Indeed, provided configuration has guava on classpath.

gradlew app:dependencies --configuration provided

+--- com.google.auto.value:auto-value:1.5
+--- com.ryanharter.auto.value:auto-value-gson:0.6.0
| +--- com.ryanharter.auto.value:auto-value-gson-annotations:0.6.0
| +--- com.google.code.gson:gson:2.8.1
| +--- com.google.auto.value:auto-value:1.4.1 -> 1.5
| +--- com.google.auto:auto-common:0.8
| | --- com.google.guava:guava:19.0
| --- com.squareup:javapoet:1.9.0
+--- javax.annotation:jsr250-api:1.0
--- frankiesardo:icepick-processor:3.2.0
+--- org.clojure:clojure:1.7.0
+--- frankiesardo:icepick:3.2.0
+--- com.google.auto.service:auto-service:1.0-rc2
| +--- com.google.auto:auto-common:0.3 -> 0.8 (*)
| --- com.google.guava:guava:18.0 -> 19.0
--- stencil:stencil:0.3.5
+--- org.clojure:clojure:1.3.0 -> 1.7.0
+--- scout:scout:0.1.0
| --- org.clojure:clojure:1.3.0 -> 1.7.0
+--- quoin:quoin:0.1.2
| --- org.clojure:clojure:1.3.0 -> 1.7.0
+--- slingshot:slingshot:0.10.3
| --- org.clojure:clojure:1.2.1 -> 1.7.0
--- org.clojure:core.cache:0.6.3
+--- org.clojure:data.priority-map:0.0.2
| --- org.clojure:clojure:1.3.0 -> 1.7.0
--- org.clojure:clojure:1.4.0 -> 1.7.0

But I thought provided dependencies only needed during compile time and
doesn't went into application package, isn't it?

—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/google/dagger/issues/897#issuecomment-335844540, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AAEEEbLniVstXykshz2YaWkGNccRrTbrks5srNsLgaJpZM4P1kai
.

Are icepick-processor and auto-value-gson using the annotationProcessor scope?

Same with auto-value-gson and auto-value

On Wed, Oct 11, 2017 at 11:15 AM Jake Wharton jakewharton@gmail.com wrote:

icepick-processor should be on the annotationProcessor configuration and
not provided.

On Wed, Oct 11, 2017 at 11:13 AM bejibx notifications@github.com wrote:

Indeed, provided configuration has guava on classpath.

gradlew app:dependencies --configuration provided

+--- com.google.auto.value:auto-value:1.5
+--- com.ryanharter.auto.value:auto-value-gson:0.6.0
| +--- com.ryanharter.auto.value:auto-value-gson-annotations:0.6.0
| +--- com.google.code.gson:gson:2.8.1
| +--- com.google.auto.value:auto-value:1.4.1 -> 1.5
| +--- com.google.auto:auto-common:0.8
| | --- com.google.guava:guava:19.0
| --- com.squareup:javapoet:1.9.0
+--- javax.annotation:jsr250-api:1.0
--- frankiesardo:icepick-processor:3.2.0
+--- org.clojure:clojure:1.7.0
+--- frankiesardo:icepick:3.2.0
+--- com.google.auto.service:auto-service:1.0-rc2
| +--- com.google.auto:auto-common:0.3 -> 0.8 (*)
| --- com.google.guava:guava:18.0 -> 19.0
--- stencil:stencil:0.3.5
+--- org.clojure:clojure:1.3.0 -> 1.7.0
+--- scout:scout:0.1.0
| --- org.clojure:clojure:1.3.0 -> 1.7.0
+--- quoin:quoin:0.1.2
| --- org.clojure:clojure:1.3.0 -> 1.7.0
+--- slingshot:slingshot:0.10.3
| --- org.clojure:clojure:1.2.1 -> 1.7.0
--- org.clojure:core.cache:0.6.3
+--- org.clojure:data.priority-map:0.0.2
| --- org.clojure:clojure:1.3.0 -> 1.7.0
--- org.clojure:clojure:1.4.0 -> 1.7.0

But I thought provided dependencies only needed during compile time and
doesn't went into application package, isn't it?

—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/google/dagger/issues/897#issuecomment-335844540, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AAEEEbLniVstXykshz2YaWkGNccRrTbrks5srNsLgaJpZM4P1kai
.

But I thought provided dependencies only needed during compile time and doesn't went into application package, isn't it?

Exactly, so Guava is present at compile-time (and Dagger generates code using it), but absent at runtime (so you're having your exception).

Looks like you're having annotation processors in that provided configuration; shouldn't you be using annotationProcessor? (disclosure: I don't know Android development much)
And only put the annotations there (or in compileOnly): auto-value-gson-annotations and frankiesardo:icepick.

(also, use --configuration compileClasspath to get the whole compilation classpath; if it works the same as in a non-Android Gradle project)

And if you need only the auto value annotations as a separate artifact:
https://github.com/JakeWharton/AutoValueAnnotations

On Wed, Oct 11, 2017 at 11:17 AM Thomas Broyer notifications@github.com
wrote:

But I thought provided dependencies only needed during compile time and
doesn't went into application package, isn't it?

Exactly, so Guava is present at compile-time (and Dagger generates code
using it), but absent at runtime (so you're having your exception).

Looks like you're having annotation processors in that provided
configuration; shouldn't you be using annotationProcessor? (disclosure: I
don't know Android development much)
And only put the annotations there (or in compileOnly):
auto-value-gson-annotations and frankiesardo:icepick.

(also, use --configuration compileClasspath to get the whole compilation
classpath; if it works the same as in a non-Android Gradle project)

—
You are receiving this because you commented.

Reply to this email directly, view it on GitHub
https://github.com/google/dagger/issues/897#issuecomment-335846060, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AAEEERo2N_uJnCAXxhn_q0zFjm2rKeaGks5srNwggaJpZM4P1kai
.

Well, I think I found the problem:

apt 'com.ryanharter.auto.value:auto-value-gson:0.6.0'
provided 'com.ryanharter.auto.value:auto-value-gson:0.6.0'

Should really be

annotationProcessor 'com.ryanharter.auto.value:auto-value-gson:0.6.0'
provided 'com.ryanharter.auto.value:auto-value-gson-annotations:0.6.0'

in case you're using AutoFactory, I found it was necessary to exclude Guava from the classpath too

    provided("com.google.auto.factory:auto-factory:1.0-beta5") {
        exclude(group: 'com.google.guava')
    }
    kapt 'com.google.auto.factory:auto-factory:1.0-beta5'

would be nice if they separated out the annotations too

capture
This is part of the DaggerApplicationComponent class and it fails for the same exception above. It seems like dagger shouldn't use this ImmutableMap from Guava at all?

If you're using Guava, we'll use Guava. You might not have declared your dependencies correctly (and you're getting Guava even when you think you might not be).

hi guys,
I fix this issue on my project with following config.

dependencies {
...
api 'org.checkerframework:checker-compat-qual:2.5.3'
api 'com.google.guava:guava:26.0-android'
...
}

Was this page helpful?
0 / 5 - 0 ratings