无法用匕首2运行kotlin

我是新手kotlin和匕首2.我尝试在Android Java中遵循本指南 。 但错误是扔…

错误:执行任务’:app:kaptDebugKotlin’失败。 内部编译器错误。 查看日志了解更多详情

我做错了什么?

应用

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

当我开始使用@Inject注释到HomeActivity类时,它的构建失败。

Gradle应用程序

 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项目

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

编辑等级日志

 * 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 

我在Kotlin上使用Dagger2,尝试这样做:

 @Inject lateinit var sharedPreferences: SharedPreferences 

代替:

 @Inject var sharedPreferences: SharedPreferences? = null 

这样我也解决了Butterknife的问题。

编辑 :打开Gradle控制台,它可以给错误: 在这里输入图像说明

通过更新AppModule解决

从应用程序(扩展应用程序)到应用程序

 @Module() class AppModule(val app: App) { @Provides @Singleton fun provideApp() = app } 

 @Module() class AppModule(val app: Application) { @Provides @Singleton fun provideApp() = app } 

我不知道为什么,但也许NetModule.class,一些提供的方法需要应用程序作为输入参数,所以Dragger可能不知道,应用程序是从Application类扩展,导致注入无法解决。

任何人都可以在这个假设上确认 请确认。

有一次,我面临同样的问题,并毁了我的一天find解决办法。 根据我的经验,我列举了几点,开发人员在将Dagger2与android kotlin集成时必须考虑到这一点。

  1. ComponentModule类中使用的范围必须相同。
  2. apply plugin: 'kotlin-kapt必须在你的build.gradle文件中,没有这个你不能够生成DaggerComponent类。

希望它能帮助一些开发者。