NoClassDefFoundError с помощью Jackson 2.2.x на Android с Gradle

Для моего Android-проекта я настроил Gradle с Jackson 2.2.x следующим образом:

// build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.0"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 18
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:18.0.0'
    compile 'com.android.support:support-v4:18.0.0'
    compile 'com.google.android.gms:play-services:3.1.36'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.2.+'
    compile 'com.fasterxml.jackson.core:jackson-core:2.2.+'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.+'
}

Я просто использую ObjectMapper здесь:

import com.fasterxml.jackson.databind.ObjectMapper;

// ...

ObjectMapper objectMapper = new ObjectMapper();
try {
    Content content = objectMapper.readValue(inputStream, Content.class);
} catch (IOException e) {
    e.printStackTrace();
}

Когда я запускаю gradle installDebug и запускаю соответствующую часть приложения, он сбой:

java.lang.NoClassDefFoundError: com.fasterxml.jackson.databind.ObjectMapper


Мысли:

  • Я заметил, что в сообщении об ошибке com.fasterxml.jackson... упоминается, а com.fasterxml.jackson.core определяется в build.gradle. Есть ли несоответствие, вызывающее проблему?
  • Я временно переместил блок dependencies в блок android, так как я нашел другие конфигурации build.gradle, структурированные таким образом. Однако, похоже, это не имеет никакого значения.

Ответ 1

Gradle и Android не всегда хорошо сочетаются с зависимостями (пока). Выполнение

 gradle clean

кажется, устраняет большинство проблем для меня.

Примечание. Если это не сработало, вы можете запустить

dexdump classes.dex | grep 'Class descriptor'

в файле classes.dex в APK. Это проверит, будет ли класс включен в файл classes.dex. (Иногда это полезно, если вы хотите дважды проверить, что происходит).

Ответ 2

Gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.app.test"
        minSdkVersion 9
        targetSdkVersion 22
        versionCode 4
        versionName "1.3"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
    }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')  
    compile 'com.android.support:appcompat-v7:22.2.0'  `enter code here`
    compile 'com.fasterxml.jackson.core:jackson-databind :2.5.3'

}

Добавьте в вас разрешение и зависимость Gradle, а затем постройте Gradle, вы получите класс обертки объекта