使用Gradle在Android上使用Jackson 2.2.x的NoClassDefFoundError

JJD*_*JJD 9 android json gradle jackson build.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.+'
}
Run Code Online (Sandbox Code Playgroud)

我只是使用ObjectMapper这里:

import com.fasterxml.jackson.databind.ObjectMapper;

// ...

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

当我运行gradle installDebug并启动应用程序的相关部分时,它会崩溃:

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


思考:

  • 我注意到在定义的错误消息com.fasterxml.jackson...中提到com.fasterxml.jackson.corebuild.gradle.是否存在导致问题的不匹配?
  • 我暂时将dependencies块移动到android块中,因为我找到了以build.gradle这种方式构造的其他配置.然而它似乎没有任何区别.

Eth*_*han 11

Gradle和Android并不总是很好地依赖于依赖(但).运行

 gradle clean
Run Code Online (Sandbox Code Playgroud)

似乎为我解决了大多数问题.

注意:如果这不起作用,您可以运行

dexdump classes.dex | grep 'Class descriptor'
Run Code Online (Sandbox Code Playgroud)

在APK的classes.dex文件中.这将检查该类是否包含在classes.dex文件中.(如果你想仔细检查最新情况,有时它会很有用).