【问题标题】:android studio: NoClassDefFoundError exception on runtime with Java Library Moduleandroid studio:使用 Java 库模块运行时出现 NoClassDefFoundError 异常
【发布时间】:2014-01-09 13:59:14
【问题描述】:

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

我的项目包含这 4 个模块:

  1. SimpleMessenger(Java 库模块)
  2. Nfc.Benchmark.Domain(Java 库模块)
  3. Nfc.Benchmark.View(Android 库模块)
  4. Nfc.Benchmark.View.Gui(Android 应用模块)

当应用程序正在运行并且引用了 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 并且在升级之前工作正常。现在我很茫然,我已经搜索了几个小时没有找到任何有用的东西。

非常感谢任何帮助!

使用 SimpleMessenger.jar 修改 build.gradle 添加到 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')
}

【问题讨论】:

  • 这可能是因为您的构建设置,如果您使用,请将您的库(.jar 文件)也添加到您的 libs 文件夹中。检查 Build Path Libraries and Projects 中的项目。 no class def 是因为链接不好
  • 你看到这个帖子了吗:stackoverflow.com/questions/16608135/…
  • 你看到这个帖子了吗:stackoverflow.com/questions/16608135/…
  • 我看到并尝试了这篇文章 coelho 中的建议,仍然遇到同样的错误。
  • @RalucaGurau:我已将引用库的 jar 添加到项目中,但我仍然遇到同样的问题。我将修改后的 build.gradle 文件添加到描述中。

标签: java android android-studio noclassdeffounderror


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我刚才也试过了,但没有成功,它在运行时失败,同样的异常。无论如何,SimpleMessenger 正在开发中,我希望对 SimpleMessenger 所做的更改直接反映在编译时,而不是每次我对其进行更改时都必须复制和粘贴库。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2023-03-26
      • 2015-04-06
      • 2014-08-18
      相关资源
      最近更新 更多