2016-03-08 74 views
2

我正在構建一個應用程序,並使用Joda Time來代替構建在Date/Time類中的java。但我面臨的一個問題,當我編譯使用 的Android API 22運行良好的應用程序,但是當我用的Android API 23編譯它拋出NoClassDefFoundError的例外。 我的build.gradle是繼NoClassDefFoundError異常android joda time

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

+0

u必須錯過了一些罐子加入到classpath中,添加這些類新到類路徑.. –

+0

@NaveenShriyan我不太明白你的意思嗎? – Tahir

+0

右鍵點擊你已添加的庫,並有選項稱爲添加到類路徑點擊它,M不知道它會工作與否,但嘗試一次,而這種異常是因爲這些類在編譯時可用,但一個運行時JVM無法找到那些拋出這個異常的類。 –

回答

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格式,那麼你可以分析它甚至不需要使用喬達。是這樣的:如果Java虛擬機或ClassLoader實例試圖在類的定義 負載

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();} 
+1

感謝您的意見。我正在嘗試它,並會讓你知道它是否有幫助 – Tahir

+0

可悲的是它沒有運行的應用程序崩潰與相同的異常 – Tahir

+0

你需要初始化喬達之前使用它?是你做的嗎? – OBX

3

的NoClassDefFoundError

拋出的異常(作爲普通的方法調用或 作爲的一部分使用新表達式創建新實例的一部分)並且沒有找到該類的定義 。

請檢查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

感謝您提出此建議。我正在嘗試它,並會讓你知道它是否工作 – Tahir

+0

@Tahir根據你的願望 –

+0

沒有工作,同樣的問題:/ – Tahir