#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.
Что я делаю в таких случаях, так это трехступенчатое решение:
- Просмотрите историю VCS и посетите все измененные файлы. Поскольку IDE компилирует каждый файл при посещении, я посмотрю, есть ли в каком-либо из них ошибки компиляции.
- Если # 1 не помогло, я бы попытался постепенно удалить код Dagger 2 из проекта (зафиксировать заранее!) и попытаться перекомпилировать по пути. Когда Dagger 2 будет удален из проблемной области, будут сгенерированы компоненты Dagger, и
javac
компиляция покажет вам фактические ошибки. - Если больше ничего не помогает, я просматриваю все файлы проекта один за другим. Я сделал это уже дважды, и это кошмар.
Я ничего не знаю о 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'