【问题标题】:Dagger 2: Unable to find generated class in Intellij Idea (Kotlin)Dagger 2:无法在 Intellij Idea (Kotlin) 中找到生成的类
【发布时间】:2017-10-17 19:49:16
【问题描述】:

我试图编写一个应用程序来理解 spark 和 dagger 2。但无法使用生成的 dagger 文件。

有多个与此类似的问题,但我无法使用其中任何一个来解决问题。

我的项目可以在github上找到here

build.gradle 文件如下所示

...
apply plugin: 'kotlin-kapt'
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    compile "com.sparkjava:spark-kotlin:$spark_kotlin_version"
    compile "org.slf4j:slf4j-log4j12:$slf4j_version"
    compile "com.google.dagger:dagger:$dagger_version"
    kapt "com.google.dagger:dagger-compiler:$dagger_version"

    testCompile group: 'junit', name: 'junit', version: '4.12'
}
....

这是我试图注入的SparkSetup.kt 类。 co.pissarra.util.dagger 包中存在此模块和组件

SetupModule.kt的内容是这样的

@Module
class SetUpModule {
    @Provides
    @Singleton
    fun provideSparkSetup() : SparkSetup {
        return SparkSetup()
    }
}

这是AppComponent.kt类

@Singleton
@Component(modules = arrayOf(SetUpModule::class))
interface AppComponent {
    fun sparkSetup() : SparkSetup
}

理想情况下,应该有一个名为DaggerAppComponent 的类,它实际上存在于构建目录中(生成目录和类)。但这仅在我不在项目中的任何地方使用DaggerAppComponent 时才有效。如果我尝试使用它,intellij idea 会给出Unresolved reference: DaggerAppComponent 的错误,并且项目也无法构建。

我想更改文件ContainerRunner.kt,而不是直接调用SparkSetup().init(),我想通过DI来完成。

【问题讨论】:

  • 我曾尝试将 Dagger 与 Idea 结合使用。生成的可能在构建文件夹中。您必须将其添加到您的 gradle 文件中的源集中。

标签: java apache-spark intellij-idea kotlin dagger-2


【解决方案1】:

这看起来像KT-17923。 请将您的 Kotlin IDE 插件版本更新为 1.1.60 或 1.2-Beta。

另外,作为一种变通方法,您可以手动指定生成的目录:

apply plugin: 'idea'
idea {
    module {
        sourceDirs += file('build/generated/source/kapt/main')
        generatedSourceDirs += file('build/generated/source/kapt/main')
    }
}

请注意,将其添加到您的build.gradle 后,您需要重新导入项目。

对我来说唯一奇怪的是该错误在构建过程中也会重现。请检查DaggerAppComponent 是否与引用它的类位于同一个包中(或者有import 指令)。

【讨论】:

    【解决方案2】:

    对我来说,它看起来像是一个 IDE (AndroidStudio / IntelliJ) 错误。

    事实:

    • 生成的类存在于路径build/generated/source/kapt/main
    • 使用这些生成的类的代码实际上工作起来更加困难,因为 IDE 用红色和Unresolved reference 错误标记它

    修复:

    sourceSets {
        main.java.srcDirs += "$buildDir/generated/source/kapt/main"
    }
    

    如果您使用protobuf,则会出现类似的问题,即生成的原型类不可见(再次出现Unresolved reference 错误)

    修复:

    sourceSets {
        main {
            java {
                srcDirs += file("${protobuf.generatedFilesBaseDir}/main/java")
                srcDirs += file("${protobuf.generatedFilesBaseDir}/main/javalite")
                srcDirs += file("${protobuf.generatedFilesBaseDir}/main/grpc")
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      相关资源
      最近更新 更多