2017-09-03 186 views
2

我是kotlin和匕首的新手2.我嘗試在Android Java中關注此guide。但錯誤是拋出...無法用匕首運行kotlin 2

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

我做錯了什麼?

應用

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) 
} 

最後,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.

搖籃應用

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 
} 

搖籃工程

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' 
} 

編輯搖籃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 
+0

發佈您的gradle日誌。 –

+0

我在哪裏可以得到這個日誌@DmitriiNechepurenko日誌保持在哪裏 –

+0

如果你使用android studio - 右下角的「gradle console」 –

回答

0

解決了更新的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 

} 

我不知道爲什麼,但也許NetModule.class,提供一些方法所需要的應用程序作爲輸入參數,所以牽引可能不知道,應用程序是由應用程序類擴展,導致無法分辨注射。

任何人都可以在此假設上確認。請確認。

+0

您沒有包含完整的錯誤日誌。如果你已經向上捲動了一下,你會發現像這樣的東西:https://stackoverflow.com/q/44912080/1837367在你的情況下,Dagger只知道你的實現'App',但你正在請求' Application'。你也可以通過添加':Application'作爲kotlin返回類型,或者添加'@Binds fun bindApp(app:App):Application'到你的模塊來解決這個問題 –

0

我使用Dagger2上科特林,試着這樣做:

@Inject lateinit var sharedPreferences: SharedPreferences 

代替:

@Inject var sharedPreferences: SharedPreferences? = null 
這樣我也解決Butterknife的問題

編輯:開放的搖籃控制檯,它可以給錯誤: enter image description here

+0

still,錯誤:執行失敗的任務':app:kaptDebugKotlin'。 >內部編譯器錯誤。請參閱日誌以獲取更多詳細信息 –

+0

一個問題:爲什麼在聲明依賴關係時使用實現而不是編譯? – ste9206

+1

@ ste0206 https://stackoverflow.com/a/44493379/2077479 –

0

在我面臨同樣的問題之前的某段時間,我的一天就找到了解決方案。根據我的經驗,我列出了以下幾點,開發人員在將Dagger2與android kotlin集成時必須考慮這些點。

  1. Component & Module類中所用的範圍必須是相同的。
  2. apply plugin: 'kotlin-kapt必須在您的build.gradle文件中,沒有這個,您無法生成DaggerComponent類。

希望它能幫助一些開發者。