3

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

下面是我的项目级 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


}
4

2 回答 2

2

这是 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'
于 2016-10-24T13:33:14.207 回答
0

该答案基于 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-11-17T20:47:07.267 回答