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, но этот объект не определен ни в одном модуле.

    Возможно, вы используете конструктор со ссылкой, которую вы не определяете ни в одном из своих модулей.

    Надеюсь, поможет!

    Другие вопросы по тегам