NoClassDefFoundError异常android joda时间

时间:2016-03-08 10:39:34

标签: java android jodatime

我正在构建一个应用程序并使用Joda Time代替java内置的Date / Time类。但我面临一个问题,当我使用编译应用程序时 Android API 22 它运行正常,但是当我用 android API 23 编译它时会抛出 NoClassDefFoundError 异常。 我的 build.gradle 正在关注

apply plugin: 'com.android.application'
android {
    compileSdkVersion 23
    buildToolsVersion '23.0.2'
    defaultConfig {
    multiDexEnabled true
    applicationId 'com.my.app'
    minSdkVersion 11
    targetSdkVersion 23
    versionCode 6
    versionName '5.0.1'
    }
    buildTypes {
        release {
        //runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
    sourceSets {
        main {
            assets.srcDirs = ['src/main/assets', 'src/main/assets/downloadMusicMishari', 'src/main/assets/downloadmusicSaad']
        }
    }
    dexOptions {
        incremental true
        javaMaxHeapSize "4g"
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    //compile 'com.android.support:support-v4:20.0.0'
    compile project(':facebook')
    compile project(':library')
    compile files('libs/PayPalAndroidSDK-2.9.10.jar')
    compile files('libs/picasso-2.5.2.jar')
    compile project(':justifiedTextViewmaster')
    compile 'joda-time:joda-time:2.3'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.google.android.gms:play-services:8.3.0'
    compile 'com.android.support:multidex:1.0.0'
}

repositories {
    mavenCentral()
}

这是错误的屏幕截图。 enter image description here

2 个答案:

答案 0 :(得分:3)

<强> NoClassDefFoundError的

  

如果Java虚拟机或ClassLoader实例尝试,则抛出该异常   加载类的定义(作为普通方法调用的一部分或   作为使用新表达式创建新实例的一部分)和否   可以找到班级的定义。

请检查 Joda-Time library with Android specialization

尝试:

dependencies {
    compile 'net.danlew:android.joda:2.9.2' // For API Level 23 or Above
}

然后 清理重建 您的IDE

修改

确保初始化JodaTimeAndroid.init(this);

  

完成后,您必须在使用之前初始化库   调用JodaTimeAndroid.init()。我建议把这段代码放进去   Application.onCreate():

public class YourApplicationClass extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        JodaTimeAndroid.init(this);
    }
}

最终修改

Removed Joda plugin

答案 1 :(得分:2)

<强> NoClassDefFoundError的

  如果Java虚拟机或ClassLoader实例尝试,则抛出

  加载类的定义(作为普通方法调用的一部分)   或者作为使用新表达式创建新实例的一部分)和否   可以找到班级的定义。

     

当前正在执行的搜索类定义存在   编译了类,但无法再找到定义。

[See This]

因此,请考虑使用专为Android设计的JODA库。您可能会问为什么使用此库而不是其他库。另一个存在一个特殊问题。即由于使用ClassLoader.getResourceAsStream(),它大大增加了应用程序的内存占用。 (有关详细信息,请参阅this blog post。)此库可以避免Android的问题。

此库还具有专为Android设计的额外实用程序。例如,请参阅DateUtils,即Android DateUtils.

的端口

尝试更改compile 'joda-time:joda-time:2.3'

至:compile 'net.danlew:android.joda:2.9.1'

这很有效。我在SDK 23的应用程序中使用它!

编辑1

如果是ISO8601格式,那么即使不使用Joda也可以解析它。这样:

try {
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        Date result = format.parse("2015-05-19T04:00:00.000Z");
        Calendar cal = Calendar.getInstance();
        cal.setTime(result);
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        output = day+" "+month+" "+year;
        Log.w("THE DATE IS:",""+output);
    }
    catch (Exception e){e.printStackTrace();}