Сбой сборки Dagger с помощью плагина realm, не удается найти класс символов DaggerApplicationComponent

#android #realm #dagger-2 #dagger #realm-mobile-platform

#Android #realm #dagger-2 #dagger #realm-мобильная платформа

Вопрос:

При настройке realm в проекте, следуя этой документации.

ниже приведена оценка уровня моего проекта :

 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


}
  

Комментарии:

1. Это потому, что вы написали "com.google.dagger:dagger-compilr:$DAGGER_VERSION" вместо "com.google.dagger:dagger-compiler:$DAGGER_VERSION" … кроме того, я склонен просто использовать apt вместо annotationProcessor , не уверен, что это что-то меняет.

2. Извините за опечатку, я уже использую com.google. dagger: dagger-compiler: $ DAGGER_VERSION можете ли вы предложить мне подходящую зависимость для annotationProcessor .

3. В любом случае, вы получаете, Cannot find symbol class DaggerApplicationComponent если ваша конфигурация Dagger обычно где-то выходит из строя. Вы должны посмотреть на точную ошибку, которую выдает ваша консоль в конце.

4. Я думаю, что Dagger 2 проглатывает ошибки, в этом случае я не получаю конкретную ошибку.

5. Он работает нормально, если я удалил конфигурацию realm.

Ответ №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'
  

Комментарии:

1. Переключение строк «применить плагин», как предложено выше, позволило мне определить основную ошибку в моем случае: критическое изменение в Realm 2.x .

2. Переключение этих строк позволило мне идентифицировать ошибку Realm, которая не позволяла Dagger генерировать свои классы, после исправления ошибки мне пришлось восстановить порядок строк, поскольку это приводит к другим ошибкам (аннотации области не обрабатываются).

Ответ №2:

Этот ответ основан на предыдущем ответе Василия. Я добавляю свои комментарии к его / ее ответу, чтобы сделать решение, которое сработало для меня, более заметным.

Как предложил Василий, изменив местами эти строки:

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

Для

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

разрешено сообщение об ошибке базовой области, которая не позволяла Dagger генерировать класс компонента моего приложения (в моем случае, критическое изменение, внесенное в 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'