2014-01-09 98 views
1

我在運行我的應用程序時遇到問題。這個問題似乎是,在運行時引用這些模塊中的類時,android studio 0.4.2中的任何java庫模塊都會創建NoClassDefFoundError。該應用程序編譯沒有錯誤或警告。android studio:運行時的NoClassDefFoundError異常與Java庫模塊

我的項目包含以下4個模塊:

  1. SimpleMessenger(Java庫模塊)
  2. Nfc.Benchmark.Domain(Java庫模塊)
  3. Nfc.Benchmark.View(安卓庫模塊)
  4. Nfc.Benchmark.View.Gui(Android應用模塊)

當應用程序正在運行,並且simplemessenger.Me ssengerService類被引用時,執行失敗並出現NoClassDefFoundError異常。

堆棧跟蹤:

01-09 14:40:13.819 1152-1152/no.as.gold.nfc.benchmark.view.gui E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.NoClassDefFoundError: no.as.gold.simplemessenger.MessengerService 
     at no.as.gold.nfc.benchmark.view.BaseTagFragment.registerMessageListeners(BaseTagFragment.java:37) 
     at no.as.gold.nfc.benchmark.view.BaseTagFragment.<init>(BaseTagFragment.java:26) 
     at no.as.gold.nfc.benchmark.view.ReadTagFragment.<init>(ReadTagFragment.java:27) 
     at no.as.gold.nfc.benchmark.view.gui.activities.MainActivity$SectionsPagerAdapter.<init>(MainActivity.java:317) 
     at no.as.gold.nfc.benchmark.view.gui.activities.MainActivity.refreshActionBar(MainActivity.java:194) 
     at no.as.gold.nfc.benchmark.view.gui.activities.MainActivity.onCreate(MainActivity.java:72) 
     at android.app.Activity.performCreate(Activity.java:5255) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2049) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2110) 
     at android.app.ActivityThread.access$600(ActivityThread.java:138) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4940) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
     at dalvik.system.NativeStart.main(Native Method) 

源代碼中的異常被拋出(MessengerService.Default.Register(...)):

public abstract class BaseTagFragment extends Fragment { 
//region fields 
private Tag mTag; 
//endregion 

//region Constructors 
/** 
* Constructor that initiates the BaseTagFragment 
*/ 
public BaseTagFragment() { 
    // Add message listeners 
    registerMessageListeners(); 
} 
//endregion 

//region Properties 
public Tag GetTag() {return mTag;} 
//endregion 

//region Private methods 
private void registerMessageListeners() { 
    // Extract tags from new intents 
    MessengerService.Default.Register(this, NewIntentMessage.class, new MessageHandler<NewIntentMessage>() { 

     @Override 
     public void handler(NewIntentMessage msg) { 
      Tag tag = msg.Intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
      if(tag != null) mTag = tag; 
     } 
    }); 
} 
//endregion 

}

之前,我升級到Android工作室0.4.2,我刪除了.gradle緩存,如下所述:https://stackoverflow.com/questions/19521764/android-studio-0-3-java-library-module-doesnt-work和那工作得很好,直到升級。現在我不知所措,我找了幾個小時找不到任何有用的東西。

任何幫助,非常感謝!

添加到庫\文件夾

與SimpleMessenger.jar修改的build.gradle(這並沒有解決問題):

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

repositories { 
    mavenCentral() 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion '17.0.0' 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 16 
    } 
    release { 
     runProguard false 
     proguardFile 'proguard-rules.txt' 
     proguardFile getDefaultProguardFile('proguard-android.txt') 
    } 
} 

dependencies { 
    compile project(':Nfc.Communication') 
    compile 'org.apache.commons:commons-lang3:3.1' 
    compile 'com.google.android:support-v4:r6' 
    compile project(':Nfc.Benchmark.Domain') 
    //compile project(':SimpleMessenger') 
    compile files('libs/SimpleMessenger.jar') 
} 
+0

這可能是因爲您的構建設置,如果你使用,將您的庫(.jar文件)也添加到您的libs文件夾中。檢查構建路徑庫和項目中的項目。沒有類的def從沒有鏈接好 –

+0

你看到這個線程:http://stackoverflow.com/questions/16608135/android-studio-add-jar-as-library? – viplezer

+0

你有沒有看到這個線程:http://stackoverflow.com/questions/16608135/android-studio-add-jar-as-library? – viplezer

回答

0

您需要包括SimpleMessenger.jar在主項目的依賴,而不是僅僅從資料庫項目。 Gradle不會從庫中依賴地傳遞鏈接;它們只用於編譯庫本身的代碼。

+0

我剛剛嘗試過這一點,但沒有成功,它失敗了運行時相同例外。在任何情況下,SimpleMessenger都在開發中,我希望SimpleMessenger所做的更改能夠在編譯時直接反映出來,而不是每次修改它時都需要複製和粘貼這個庫。 –

0

我降級到Android Studio 0.3.2。一旦完成,我刪除了.gradle緩存並構建瞭解決方案(ctrl + F9),然後它就可以工作。這是一種解決方法,因此,如果任何人任何其他解決方案的瞭解,請發表:)