2

I'm new to kotlin and dagger 2. I try to following this guide in Android Java. but error was throw...

Error:Execution failed for task ':app:kaptDebugKotlin'. Internal compiler error. See log for more details

What did I do wrong?

Application

class App : Application() {

    val netComponent: NetComponent by lazy {
        DaggerNetComponent.builder()
                .appModule(AppModule(this)) // This also corresponds to the name of your module: %component_name%Module
                .netModule(NetModule("https://api.github.com"))
                .build()
    }

    override fun onCreate() {
        super.onCreate()
    }

    fun netComponent() : NetComponent = netComponent
}

NetComponent

@Singleton
@Component(modules= arrayOf(AppModule::class, NetModule::class))
interface NetComponent {
    fun inject(activity: HomeActivity)
}

NetModule

@Module()
class NetModule(baseUrl: String) {

    val mBaseUrl: String = baseUrl;

    @Provides
    @Singleton
    fun providedSharedPreferences(app: Application): SharedPreferences {
        return PreferenceManager.getDefaultSharedPreferences(app);
    }

    @Provides
    @Singleton
    fun provideOkHttpCache(app: Application): Cache {
        val cacheSize = 10 * 1024 * 1024 // 10 MiB
        return Cache(app.cacheDir, cacheSize.toLong())
    }

    @Provides
    @Singleton
    fun providedGson(): Gson {
        return GsonBuilder()
                .excludeFieldsWithoutExposeAnnotation()
                .create();
    }

    @Provides
    @Singleton
    fun provideOkHttpClient(cache: Cache): OkHttpClient {
        return OkHttpClient.Builder()
                .cache(cache)
                .build();
    }

    @Provides
    @Singleton
    fun provideRetrofit(gson: Gson, okHttpClient: OkHttpClient): Retrofit {
        return Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(mBaseUrl)
                .client(okHttpClient)
                .build()
    }

}

AppModule

@Module()
class AppModule(val app: App) {

    @Provides
    @Singleton
    fun provideApp() = app

}

AppComponent

@Singleton
@Component(modules = arrayOf(AppModule::class))
interface AppComponent {

    fun inject(app: App)
}

Finally, HomeActivity

class HomeActivity : AppCompatActivity() {

    @Inject var sharedPreferences: SharedPreferences? = null;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)
        (application as App).netComponent.inject(this)
    }
}

It's build failed when I start using @Inject annotation to HomeActivity Class.

Gradle App

apply plugin: 'com.android.application'

apply plugin: 'kotlin-kapt'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    defaultConfig {
        applicationId "com.viinsoft.mobile.app"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    // App's dependencies, including test
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    kapt "com.google.dagger:dagger-compiler:$dragger"
    implementation "com.google.dagger:dagger:$dragger"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation "com.android.support:design:$supportLibraryVersion"
    implementation "com.android.support.constraint:constraint-layout:$constraintLayout"
    implementation "com.github.bumptech.glide:glide:$glideVersion"
    implementation "com.squareup.retrofit2:retrofit:$retrofit"
    implementation "com.squareup.retrofit2:converter-gson:$retrofit"
    implementation "com.google.code.gson:gson:$gson"
    implementation "com.google.guava:guava:$guavaVersion"
    implementation "com.android.support.test.espresso:espresso-idling-resource:$espressoVersion"

    // Dependencies for local unit tests
    testCompile "junit:junit:$junitVersion"
    testCompile "org.mockito:mockito-all:$mockitoVersion"
    testCompile "org.hamcrest:hamcrest-all:$hamcrestVersion"
    testCompile "org.powermock:powermock-module-junit4:$powerMockito"
    testCompile "org.powermock:powermock-api-mockito:$powerMockito"

    // Android Testing Support Library's runner and rules
    androidTestCompile "com.android.support.test:runner:$runnerVersion"
    androidTestCompile "com.android.support.test:rules:$rulesVersion"

    // Espresso UI Testing dependencies.
    androidTestCompile ("com.android.support.test.espresso:espresso-core:$espressoVersion", {
        exclude group: 'com.google.code.findbugs'
    })
    androidTestCompile ("com.android.support.test.espresso:espresso-contrib:$espressoVersion", {
        exclude group: 'com.google.code.findbugs'
    })
    androidTestCompile ("com.android.support.test.espresso:espresso-intents:$espressoVersion", {
        exclude group: 'com.google.code.findbugs'
    })
}

kapt {
    generateStubs = true
}

Gradle Project

buildscript {
    ext.kotlin_version = '1.1.4-3'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-beta4'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

ext {
    // Sdk and tools
    minSdkVersion = 16
    targetSdkVersion = 26
    compileSdkVersion = 26
    buildToolsVersion = '26.0.1'

    // App dependencies
    supportLibraryVersion = '26.0.2'
    constraintLayout = '1.0.2'
    retrofit = '2.3.0'
    gson = '2.8.1'
    glideVersion = '4.0.0'
    guavaVersion = '23.0-android'
    dragger = '2.11'

    // Dependencies for local unit tests
    junitVersion = '4.12'
    mockitoVersion = '1.10.19'
    powerMockito = '1.7.1'
    hamcrestVersion = '1.3'

    // Android Testing Support Library's runner and rules
    runnerVersion = '1.0.0'
    rulesVersion = '1.0.0'

    // Espresso UI Testing dependencies.
    espressoVersion = '3.0.1'
}

EDIT GRADLE LOG

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:kaptDebugKotlin'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.api.GradleException: Internal compiler error. See log for more details
        at org.jetbrains.kotlin.gradle.tasks.TasksUtilsKt.throwGradleExceptionIfError(tasksUtils.kt:9)
        at org.jetbrains.kotlin.gradle.internal.KaptTask.compile(KaptTask.kt:71)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:731)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:705)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
        ... 27 more
Jongz Puangput
  • 5,527
  • 10
  • 58
  • 96

3 Answers3

0

I'm using Dagger2 on Kotlin, try to do this:

@Inject lateinit var sharedPreferences: SharedPreferences

instead of:

@Inject var sharedPreferences: SharedPreferences? = null

in this way I've solved also the problem of Butterknife.

EDIT: open Gradle Console, it could give the error: enter image description here

ste9206
  • 1,822
  • 4
  • 31
  • 47
  • still, Error:Execution failed for task ':app:kaptDebugKotlin'. > Internal compiler error. See log for more details – Jongz Puangput Sep 03 '17 at 08:54
  • a question: why you use implementation instead of compile when you declare dependencies? – ste9206 Sep 03 '17 at 08:56
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/153546/discussion-between-ste9206-and-jongz-puangput). – ste9206 Sep 03 '17 at 09:28
0

Solved by update AppModule

from App (which extend Application) to Application

FROM

@Module()
class AppModule(val app: App) {

    @Provides
    @Singleton
    fun provideApp() = app

}

TO

@Module()
class AppModule(val app: Application) {

    @Provides
    @Singleton
    fun provideApp() = app

}

I don't know why, but maybe NetModule.class, some provided method required Application as input parameter, so Dragger may not know that App is extend from Application class, result in fail to resolved injection.

anyone can confirm on this assumption. please confirm.

Jongz Puangput
  • 5,527
  • 10
  • 58
  • 96
  • You did not include the full error log. If you'd have scrolled up a bit further you'd have discovered something like here: https://stackoverflow.com/q/44912080/1837367 In your case Dagger only knew about your implementation `App` but you were requesting an `Application`. You could also have solved this by adding `: Application` as the kotlin return type, or adding `@Binds fun bindApp(app: App) : Application` to your module – David Medenjak Sep 03 '17 at 21:05
0

Sometime before I faced the same problem and ruined my 1 day to find the solution for this. And as per my experience I am listing few points below which developer must take in consideration while integrating Dagger2 with android kotlin.

  1. The scope used in Component & Module classes must be same.
  2. apply plugin: 'kotlin-kapt must be in your build.gradle file, without this you are not able to generate DaggerComponent class.

Hope it will help some developers out.

Rahul Sharma
  • 12,515
  • 6
  • 21
  • 30