android studio:Java库模块运行时的NoClassDefFoundError异常

时间:2014-01-09 13:59:14

标签: java android android-studio noclassdeffounderror

我在运行应用时遇到问题。问题似乎是android studio 0.4.2中的任何java库模块在运行时引用这些模块中的类时会创建NoClassDefFoundError。该应用程序编译时没有错误或警告。

我的项目包含以下4个模块:

  1. SimpleMessenger(Java库模块)
  2. Nfc.Benchmark.Domain(Java Library module)
  3. Nfc.Benchmark.View(Android库模块)
  4. Nfc.Benchmark.View.Gui(Android应用程序模块)
  5. 当应用程序运行并且引用了simplemessenger.MessengerService类时,执行失败并出现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 Studio 0.4.2之前,我删除了.gradle缓存,如下所述:https://stackoverflow.com/questions/19521764/android-studio-0-3-java-library-module-doesnt-work并且在升级之前工作正常。现在我不知所措,我搜索了几个小时而没有发现任何有用的东西。

    非常感谢任何帮助!

    修改了build.gradle并将SimpleMessenger.jar添加到libs \文件夹中(这没有解决问题):

    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')
    }
    

3 个答案:

答案 0 :(得分:1)

此问题已在Android Studio 0.4.4:D(http://tools.android.com/recent/androidstudio044released

中得到解决

答案 1 :(得分:0)

您需要在主项目的依赖项中包含SimpleMessenger.jar,而不仅仅是您的库项目。 Gradle不会传递链接来自库的依赖关系;它们只用于编译库代码本身。

答案 2 :(得分:0)

我降级到Android Studio 0.3.2。完成后,我删除了.gradle缓存并构建了解决方案(ctrl + F9),然后就可以了。这是一种解决方法,所以如果有人知道任何其他解决方案,请发布:)