Dagger构建失败,带有realm插件,无法找到符号类DaggerApplicationComponent

时间:2016-10-24 11:32:59

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

通过遵循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"
}

app level gradle:

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


}

2 个答案:

答案 0 :(得分:2)

这是Dagger 2最严重的缺点之一 - 它的错误报告非常糟糕。我经常观察到这些错误,你无法理解那条消息。

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

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

  1. 查看VCS历史记录并访问所有已更改的文件。由于IDE在访问时编译每个文件,我将看其中是否有任何编译错误。
  2. 如果#1没有帮助,我会尝试从项目中逐步删除Dagger 2代码(事先提交!)并尝试重新编译。当Dagger 2从有问题的区域移除时,将生成Dagger组件,javac编译将显示实际错误。
  3. 如果没有其他帮助,我将逐个访问所有项目文件。已经完成了两次,这是一场噩梦。
  4. 我对Realm一无所知,但是因为我看到它使用自己的插件,所以你可以先改变build.gradle中插件设备的顺序。切换这些行:

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

答案 1 :(得分:0)

这个答案是基于Vasiliy之前的回答。我正在向他/她的回答宣传我的评论,以便使对我有用的解决方案更加明显。

正如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'