NoClassDefFoundError mit Jackson 2.2.x auf Android mit Gradle
Für mein Android Projekt einrichten ich Gradle mit Jackson 2.2.x wie folgt:
//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.+'
}
Ich einfach die ObjectMapper
hier:
import com.fasterxml.jackson.databind.ObjectMapper;
//...
ObjectMapper objectMapper = new ObjectMapper();
try {
Content content = objectMapper.readValue(inputStream, Content.class);
} catch (IOException e) {
e.printStackTrace();
}
Wenn ich gradle installDebug
und starten Sie den relevanten Teil der Anwendung stürzt es ab:
java.lang.NoClassDefFoundError: com.fasterxml.jackson.databind-Methode.ObjectMapper
Gedanken:
- Ich bemerkt, dass in der Fehlermeldung
com.fasterxml.jackson...
erwähnt wird, währendcom.fasterxml.jackson.core
definiert ist, inbuild.gradle
. Ist es ein Konflikt, der das problem verursacht? - Ich zog vorübergehend die
dependencies
- block in denandroid
block, da ich gefunden anderenbuild.gradle
- Konfigurationen strukturiert auf diese Weise. Aber es scheint keinen Unterschied zu machen.
- Können Sie entpacken die APK und führen Sie
dexdump classes.dex | grep 'Class descriptor'
und sehen, ob Lcom/fasterxml/jackson/databind/ObjectMapper ? - Nein, der klassendeskriptor für
ObjectMapper
ist nicht enthalten in derclasses.dex
vonFoobar-debug-unaligned.apk
. - können Sie eine
gradle clean installDebug
finden Sie unter wenn das nicht funktioniert, wenn es funktioniert poste die Ausgabe vongradle dependencies
- Fand den gleichen Hinweis hier, gleichzeitig. Läuft
gradle clean
ist die Lösung des Problems. Entnehmen Sie bitte Ihren Kommentar in eine Antwort. Vielleicht kombinieren Sie die beiden Kommentare da waren beide hilfreich!!! - gut zu hören, dass für Sie gearbeitet. Kommentare extrahiert.
- Genial. Nochmals vielen Dank. Dies war gegessen, eine Menge meiner Zeit. Haben eine schöne Woche.
- Ich habe einige Gedanken zu deinen Gedanken. Gradle wird Sie in irgendeine Abhängigkeit benötigt, die durch Ihre definierten Abhängigkeiten. Sie können dies durch ausführen
gradle dependencies
. Die top-Ebene des Diagramms Ihre Abhängigkeiten definiert sind, etwas niedriger, (eingerückt) sind die 'transiente' Abhängigkeiten. Es gibt drei Phasen für den Aufbau der gradle-Skript. Hier der Link: gradle.org/docs/current/userguide/build_lifecycle.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gradle und Android nicht immer gut mit Abhängigkeiten(noch) nicht. Läuft
scheint zu lösen die meisten Probleme für mich.
Hinweis: Wenn das nicht funktioniert, führen Sie
auf die Klassen.dex-Datei in der APK. Das wird überprüfen, um zu sehen, ob die Klasse enthalten ist, in der
classes.dex
- Datei. (Manchmal ist es nützlich, wenn Sie möchten, um zu überprüfen, was Los ist).Gradle
Hinzufügen Genehmigung und Abhängigkeit in Sie Gradle und dann build gradle erhalten Sie Objekt-wrapper-Klasse