【问题标题】:Dagger build fails with realm plugin, Cannot find symbol class DaggerApplicationComponent使用领域插件的 Dagger 构建失败,找不到符号类 DaggerApplicationComponent
【发布时间】:2016-10-24 11:32:59
【问题描述】:

按照this 文档在项目中设置领域时。

下面是我的项目级 gradle:

buildscript {
repositories {
    jcenter()
    maven { url 'https://maven.fabric.io/public' }
}
dependencies {
    classpath 'com.android.tools.build:gradle:2.2.0'

    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    // Realm
    classpath "io.realm:realm-gradle-plugin:1.2.0"
}

应用级分级:

apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'realm-android'

dependencies {
 final DAGGER_VERSION = '2.7'
....
    def daggerCompiler = "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
    annotationProcessor daggerCompiler
    testAnnotationProcessor daggerCompiler
    androidTestAnnotationProcessor daggerCompiler

    compile  "com.google.dagger:dagger:$DAGGER_VERSION"
    provided 'org.glassfish:javax.annotation:10.0-b28' //Required by Dagger2


}

【问题讨论】:

  • 因为你写的是"com.google.dagger:dagger-compilr:$DAGGER_VERSION"而不是"com.google.dagger:dagger-compiler:$DAGGER_VERSION"...另外,我倾向于只使用apt而不是annotationProcessor,不确定这是否会改变任何东西。
  • 对不起,我已经在使用 com.google.dagger:dagger-compiler:$DAGGER_VERSION 你能建议我对 annotationProcessor 的依赖吗?
  • 无论如何,如果您的 Dagger 配置在某处失败,您通常会收到 Cannot find symbol class DaggerApplicationComponent。您应该查看控制台最后给出的确切错误。
  • 我认为 Dagger 2 吞下错误在这种情况下我没有收到具体错误。
  • 如果我删除了领域配置,它工作正常。

标签: android realm dagger-2 dagger realm-mobile-platform


【解决方案1】:

这是 Dagger 2 最严重的缺点之一 - 它的错误报告非常糟糕。我经常观察到这类错误,你无法从该消息中理解任何事情。

问题在于 Dagger 2 预处理器在 javac 编译之前运行,如果无法处理代码,则预处理器会失败,不会生成组件实现。据我所知,预处理器不会报告导致失败的错误。然后,当javac 编译执行时,由于找不到生成的文件而失败,但它不会继续编译其他文件,因此您看到的唯一错误是缺少 Dagger 组件。

在这种情况下,我所做的是三步解决方案:

  1. 查看 VCS 历史记录并访问所有更改的文件。由于IDE在访问时编译每个文件,我会看看其中是否有任何编译错误。
  2. 如果 #1 没有帮助,我会尝试从项目中逐步删除 Dagger 2 代码(提前提交!)并尝试在途中重新编译。当 Dagger 2 从有问题的区域移除时,将生成 Dagger 组件,javac 编译将显示实际错误。
  3. 如果没有其他帮助,我将一一访问所有项目文件。已经做过两次了,简直是一场噩梦。

我对 Realm 一无所知,但由于我看到它使用自己的插件,因此您可以从更改 build.gradle 中的插件设备的顺序开始。切换这些行:

apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'realm-android'

【讨论】:

  • 按照上面的建议切换“应用插件”行使我能够识别我的情况的潜在错误:Realm 2.x 中的重大变化。
  • 虽然切换这些行允许我识别阻止 Dagger 生成它的类的领域错误,但在更正错误后我必须恢复行的顺序,因为它引入了其他错误(领域注释是未处理)。
【解决方案2】:

此答案基于 Vasiliy 先前的答案。我正在向他/她的答案推广我的 cmets,以使对我有用的解决方案更加明显。

正如 Vasiliy 建议的那样,颠倒这些行:

apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'realm-android'

apply plugin: 'realm-android'
apply plugin: 'com.neenbedankt.android-apt'

允许报告阻止 Dagger 生成我的应用程序组件类的底层 Realm 错误(在我的例子中,是 Realm 2.x 中引入的重大更改)。

解决此问题后,我收到了重新排序的 apply plugin 行此错误:

java.lang.IllegalArgumentException: XXX is not part of the schema for this Realm

通过重新排序插件,Realm 注释不会按需要进行处理。所以插件行必须恢复到:

apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'realm-android'

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多