Gradle проект не строит, когда я добавляю RoboBlender
Я добавил зависимость RoboGuice 3 в мой файл сборки gradle, который он компилирует и запускает, однако приложение вылетает из-за NoClassDefFoundError: AnnotationDatabaseImpl. Провел некоторые исследования, в которых предполагалось, что RoboBlender необходим для генерации определения (я знаком с RoboGuice 2, для которого не требуется RoboBlender), но когда я добавляю RoboBlender, проект больше не собирается.
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.android.support:cardview-v7:21.0.+'
compile 'com.android.support:recyclerview-v7:21.0.+'
compile 'com.koushikdutta.urlimageviewhelper:urlimageviewhelper:1.0.4'
compile 'de.hdodenhof:circleimageview:1.2.1'
compile 'com.getbase:floatingactionbutton:1.4.0'
compile 'de.hdodenhof:circleimageview:1.2.1'
compile 'org.twitter4j:twitter4j-core:4.0.2'
compile files('libs/json-me.jar')
compile files('libs/twitter_api_me-1.9.jar')
compile('ch.acra:acra:4.5.0') {
exclude group: 'org.json'
}
compile 'org.roboguice:roboguice:3.0.1'
provided 'org.roboguice:roboblender:3.0.1'
}
Ошибка сборки:
Error:Execution failed for task ':app:compileDebugJava'.
java.lang.ClassCastException: com.sun.tools.javac.code.Type не может быть приведен к javax.lang.model.type.DeclaredType l>
Кэш зависимостей Gradle может быть поврежден (это иногда происходит после истечения времени ожидания сетевого подключения.) Повторно загрузите зависимости и синхронизируйте проект (требуется сеть) Состояние процесса сборки Gradle (демон) может быть повреждено. Остановка всех демонов Gradle может решить эту проблему. Остановить процессы сборки Gradle (требуется перезагрузка) В случае поврежденных процессов Gradle вы также можете попробовать закрыть IDE и затем убить все процессы Java.
Что вызывает это и как я могу это исправить?
3 ответа
Ну, я нашел обходной путь, я просто отключил обработку AnnotationDatabase и удалил зависимость RoboBlender, и это решило мою проблему. Я все еще хотел бы знать, почему у меня эта проблема во-первых.
Такая ошибка может быть вызвана использованием @Inject
неправильно, как в следующем примере:
public class Foo {
@Inject
public Foo(Context context, int code) {
//this won't work because of the primitive in the constructor
//and the @Inject annotation are being used together
}
}
RoboBlender не сможет создать базу данных из-за невозможности привести примитив к объявленному типу.
Следовательно, ваше сообщение об ошибке
java.lang.ClassCastException: com.sun.tools.javac.code.Type cannot be cast to javax.lang.model.type.DeclaredType
означает, что примитив (com.sun.tools.javac.code.Type)
не может быть преобразован в ссылочный тип javax.lang.model.type.DeclaredType
Вместо этого вам нужно написать провайдера:
public class FooProvider implements Provider<Foo> {
Context context;
private static int CODE = 1;
@Inject
public FooProvider(Context context) {
this.context = context;
}
@Override
public Foo get() {
return new Foo(context, CODE);
}
}
и связать Foo
этому провайдеру в модуле
binder.bind(Foo.class).toProvider(FooProvider.class);
и удалите @Inject
от конструктора Foo
,
Я предлагаю вам пройтись по графу объектов и найти @Inject
аннотации на конструкторы с примитивами в них. Удалите аннотации и напишите поставщиков для них, как указано выше. RoboBlender будет правильно строить AnnotationsDatabaseImpl
и ваш проект скомпилируется.
У меня была та же проблема, и в моем случае, имея класс с 2 конструкторами:
@Inject
public PaymentSelectionDialog(Context context) {
this.context = context;
}
@Inject
public PaymentSelectionDialog(Context context, PaymentSelectable paymentSelectable) {
this.context = context;
this.paymentSelectable = paymentSelectable;
У меня не было проблем с использованием первого конструктора, но когда я создавал свой объект с помощью второго конструктора, у меня возникла эта проблема. Таким образом, проблема в том, что Roboguice пытается внедрить объект, который реализует интерфейс PaymentSelectable, но этот объект не определен ни в одном модуле.
Возможно, вы используете конструктор со ссылкой, которую вы не определяете ни в одном из своих модулей.
Надеюсь, поможет!