【问题标题】:NoClassDefFoundError for code in an Java library on AndroidAndroid 上 Java 库中代码的 NoClassDefFoundError
【发布时间】:2012-01-30 12:10:21
【问题描述】:

我的用户经常遇到错误。应用程序在启动过程中崩溃。当应该加载 MainActivity 时,VM 显然找不到该类。我不知道为什么。该应用程序的架构是我的免费版和专业版都在使用一个通用项目。不知道是否相关。请参阅下面的堆栈跟踪。有什么想法吗?

java.lang.NoClassDefFoundError: com.android.common.MainActivity
at com.mycompany.myapp.Splash.onCreate(Splash.java:23)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.android.common.MainActivity in loader     dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.android.pro-1.apk]

编辑: 感谢下面的评论,理查德。现在我已将com.android.Splash 更改为其他内容。无论如何,这不是真正的类名。我的坏...!

【问题讨论】:

  • 您为什么曾经尝试在已经存在的包中创建一个类? (com.android.*)。形式不好,换个包试试。
  • 这种情况只是偶尔发生吗?还是当你在本地构建时它总是发生?
  • 只有在应用启动到 Play 时才会发生这种情况。我自己没见过,所以我刚刚看到了在 Crittercism 上检索到的堆栈跟踪。

标签: android noclassdeffounderror


【解决方案1】:

我遇到了同样的问题,我做了以下解决问题。

  1. 转到项目的“属性”。
  2. 选择“Java 构建路径”
  3. 选择“订购和导出”选项卡
  4. 您应该在此处看到所选项目的“src”和“gen”路径和依赖项。
  5. 他们列出的顺序是首先是“src”,然后是“gen”路径
  6. 我切换它们,以便在“src”之前构建“gen”文件夹

gen - 项目中的自动化代码(来自依赖项和引用)
src - 项目中的源代码

无需重新启动 Eclipse。它刚刚开始工作。

老实说,我从未尝试过“Android 工具 > 修复项目属性”,有时它可能会做同样的事情。我不知道,我只是在看到错误消息后做了上面的,认为构建路径有问题。


编辑


后来这还不够,我再次收到错误。然后我“检查”了该视图中列出的所有依赖项。现在它又可以工作了。到目前为止,一切都很好。如果再次失败,我会保持更新。

仅供参考:在我最后一次尝试中,我尝试了“Android 工具 > 修复项目属性”,但对我来说没有成功。

【讨论】:

  • 您编辑的答案也对我有用...由于 ClassDefNotFoundError 导致我的头发拉了 2-3 小时
  • 我要发表评论,也许有一天有人会找到。我的问题是从一个不应该使用的库项目中引用一个类。我在“库”选项卡中找到了错误/解决方案。我不知道它是否会帮助任何人,但现在它在互联网上。
  • 您将“gen”切换为“src”的建议奏效了,其他一切都失败了!谢谢!
  • 那个解决方案对我不起作用。但是,将包含的 JAR 文件移到顶部确实如此。这是为 AFreeChart 准备的。通常,更改构建顺序是可以解决此问题的答案的一部分。 NoClassDefFoundError 是一个难以追查的问题。顺便说一句:我经常删除 gen 以导致重建。在这种情况下,gen 被移到底部。这对我来说从来都不是问题。
  • 这里还有一个对我有用的成功尝试......按照提到的 6 个步骤,然后在“订购和导出”选项卡中取消选择我自己的库(杰克逊等)
【解决方案2】:

我目前使用的是 SDK 20.0.3,以前的解决方案都不适合我。

我能够让事情顺利进行

  • 右键单击 Android 项目
  • 然后选择 Build Path -> Link Source 以打开 Link Source 对话框。
  • 然后我指定了 Java 项目的 'src' 文件夹,并给它起了一个不同于默认 'src' 的名称(例如 'src2')。
  • 您现在可以右键单击 -> 删除新的“src2”文件夹。

这带来了创建的 Java 类文件,这些文件是在构建 Android 项目时为 Dalvik VM 而不是 Java VM 编译的。这允许 Android 库 jar 文件中的 Java 类文件在创建 Android 项目 .apk 时通过 dexing。现在,当应用程序运行时,会找到 Java 项目类,而不是抛出 Java.lang.NoClassDefFoundError。

如果您想使用 jar 文件而不是链接源代码,那么您需要创建一个 Library Android 项目。 (在“属性”->“Android”中选中“is library”的 Android 项目。)然后,您需要将 Java 项目的源链接到 Android 库项目,如上所述,或者从“src”文件夹中复制源文件将 Java 项目复制到 Android 库项目的“src”文件夹中。构建 Android 库项目。然后,您将能够将创建的 Android 项目 jar 文件复制到 Android 文件夹的“libs”文件夹中,因为其中的类文件是在构建 Android 项目时为 Davlik VM 而不是 Java VM 编译的。这允许 Android 库 jar 文件中的 Java 类文件在创建 Android 项目 .apk 时通过 dexing。现在,当应用程序运行时,将找到 Java 项目类,而不是抛出 Java.lang.NoClassDefFoundError。

【讨论】:

    【解决方案3】:

    尝试转到项目 -> 属性 -> Java 构建路径 -> 订购和导出,并确保为您的项目和您正在使用的所有其他库项目检查 Android 私有库。我通过下面的链接NoClassDefFoundError Android Project得到了解决方案?

    【讨论】:

      【解决方案4】:

      以防万一它对某人有所帮助,我遇到了同样的问题。我的 jar 文件位于 libs 目录下,并且该 jar 已添加到构建路径中。它仍然抛出异常。

      我刚刚清理了项目,它对我有用。

      Eclipse -> 项目 -> 清理 -> 选择项目并清理

      【讨论】:

        【解决方案5】:

        我尝试了上述所有解决方案,但没有为我解决, 这是我为完成它所做的事情 项目-> 配置构建路径-> 排序和导出-> 将依赖项目移到顶部

        【讨论】:

          【解决方案6】:

          当您制作的应用程序使用 Google API(例如地图)但在以 Android API 为目标的设备上运行时,也会产生此错误。

          【讨论】:

          • 这终于解决了我的问题。不知何故,修复项目属性功能不会改变目标。我通过更新我的谷歌 api 解决了这个问题
          【解决方案7】:

          我在使用 java.nio.charset.StandardCharsets 时遇到了这个 NoClassDefFoundError。

          原因是 StandardCharsets 直到 JRE 1.7 才存在。如果我将 java 编译版本设置为 1.7,Eclipse 会抱怨“Android 需要编译器合规级别 5.0 或 6.0”。因此,我通过右键单击项目名称-> Android 工具-> 修复项目属性来修复它。它是用JRE1.6编译的。

          但是,因为 StandardCharsets 直到 1.7 才存在。运行时报NoClassDefFoundError。

          直到尝试了很多其他方法(包括重新安装 JDK)之后,我才意识到这一点。 NoClassDefFoundError 的含义清楚地说明了真正的原因:尽管通过了编译,但在运行时找不到该类。

          一般的结论是只要Android不支持JRE 1.7,如果你使用1.7以后提供的任何新特性,都会遇到这个错误。

          我的解决方案是将这些源代码复制到我的代码中!

          【讨论】:

          • +1 我尝试使用使用 Java 1.7 编译的 .jar 文件。使用 Java 1.6 重新编译 jar 后,它工作正常。
          【解决方案8】:

          NoClassDefFoundError 描述来自 SO 标签:

          Java 虚拟机或类加载器抛出的 Java 错误 实例尝试加载类的定义(作为 普通方法调用或作为使用 new 创建新实例的一部分 表达式)并且找不到类的定义。这 搜索到的类定义在当前执行时存在 类已编译,但无法再找到定义。

          或者更好:

          Java 中的 NoClassDefFoundError 在 Java 虚拟机不存在时出现 能够在运行时找到一个特定的类,该类在运行时可用 编译时间。

          来自this 页面。检查一下,有一些方法可以解决错误。希望对你有帮助。

          【讨论】:

          • 谢谢阿尔贝托!你的帖子帮助我理解了这个问题。现在我很好奇 Android 是如何处理类路径的。目前正在阅读本期:stackoverflow.com/questions/1095322/…
          • @Kjoendo 欢迎您。我将阅读有关该问题的链接。 :)
          • 我刚刚收到了这个ConcurrentSkipListMap;我认为这是因为我的应用程序是在 Froyo 设备上运行的,而 Froyo 中没有该类;但是,AdMob 要求我定位冰淇淋三明治,所以我没有注意到这一点!
          【解决方案9】:

          就我而言,我试图将使用 jre 1.7 编译的普通 java 类(来自普通 java 项目)添加到使用 jre 1.7 编译的 android 应用程序项目中。

          解决方案是使用 jre 1.6 重新编译该普通 java 类,并像往常一样添加对 android 应用程序项目(也使用 jre 1.6 编译)的引用(按 Tab 键顺序和导出,请务必检查类、项目等)。

          同样的过程,当使用 android 库引用外部普通 java 类时。

          不知道jre 1.7有什么问题,从普通java项目编译普通java类并尝试在android应用程序或android库项目中引用它们。

          如果您不使用普通 java 类(来自普通 java 项目),则无需降级到 jre 1.6。

          【讨论】:

            【解决方案10】:

            对我来说,这个问题与我使用的 API 未部署有关。例如,我使用了ZSDK_API.jar 作为参考。

            要解决此问题,我必须右键单击项目并选择属性。在 JAVA BUILD PATH 中,我必须添加未部署的 API。这很奇怪,因为应用程序抛出未找到 MainActivity 类,而实际上该错误是由未找到 DiscoveryHandler 类引起的。

            希望这对某人有所帮助。

            【讨论】:

              【解决方案11】:

              我遇到了 NoClassDefFoundError,因为我的项目中存在一个类(不是库类)。该类存在,但我得到了 NoClassDefFoundError。就我而言,问题是多索引支持。问题及解决方法在这里:Android Multidex and support libraries

              对于低于 5.0 的 Android 版本,您会收到此错误。

              【讨论】:

                【解决方案12】:

                Android Studio 上:

                1) 在您的默认配置中添加multiDexEnabled = true

                2) 在你的依赖项

                中添加编译com.android.support:multidex:1.0.0

                3) Application class 扩展 MultiDexApplication 而不仅仅是 Application

                【讨论】:

                  【解决方案13】:

                  其他想法。 例如,您有从“android.support.v4.app.Fragment”派生的类。

                  但是你犯了一个错误并从“android.app.Fragment”继承了它。然后你会在 Android 2 设备上出现这个错误。

                  【讨论】:

                    【解决方案14】:

                    我刚刚发现了这个错误。

                    只需确保库 jar 文件包含 android.support.v7.appcompat 包下已编译的 R 类,并将 v7 appcompat 支持“项目”中的所有资源复制到 ANDROID_SDK_HOME/extras/android/support/v7/ appcompat 文件夹。

                    我使用带有 Android 插件的 Netbeans,这解决了我的问题。

                    【讨论】:

                      【解决方案15】:

                      我猜你在创建公用库时没有指定javac的目标,所以javac自动使用最新的可用目标,可能是1.7(Java7)或1.8(Java8)。

                      已经说过了

                      Android 要求编译器合规级别为 5.0 或 6.0

                      dx 的 Android 构建工具

                      因此,要么使用 >= 19.0.0 的构建工具版本,要么使用带有 -target 6javac,例如像这样修改你的 ant build.xml

                      <javac
                      srcdir="src/"
                      destdir="build/"
                      target="6"
                      />
                      

                      【讨论】:

                        【解决方案16】:

                        我通过在 project.properied 中手动添加库项目路径来解决此问题。 一些eclipse没有自动添加这个条目以及“添加项目”。因此,当应用程序试图在 lib 项目中引用任何组件时它崩溃了。

                        你也可以尝试同样的事情。 projec.properties 中的应用程序依赖关系,如

                        android.library.reference.1=....\android-sdks\extras\google\google_play_services\libproject/google-play-services_lib

                        然后运行。

                        【讨论】:

                          【解决方案17】:

                          jars 以前在 lib/ 文件夹中,现在它们在 libs/ 中 如果您使用 lib,您可以将您的 jar 从 lib 移动到 libs,并从项目属性/java 构建路径中删除依赖项,因为 Android 现在会自动找到它们。

                          【讨论】:

                            【解决方案18】:

                            对我来说,问题是引用的库是使用 java 7 构建的。我通过使用 1.6 JDK 重建解决了这个问题。

                            【讨论】:

                              【解决方案19】:

                              使用 ART 而不是 Dalvik 运行时有时会出现 java.lang.NoClassDefFoundError: 错误。要更改运行时,只需转到开发人员选项 -> 选择运行时 -> Dalvik。

                              【讨论】:

                                【解决方案20】:

                                如果上述方法都不起作用(就像我遇到的那样),并且您正在将 Eclipse 中的另一个项目用作库。

                                这样做: 右键项目 -> 属性 -> Android -> 库 -> 添加

                                这对我有用! Adding a project as a library (Project Properties)

                                【讨论】:

                                  【解决方案21】:

                                  Activity 再次添加到清单中。我在清单中尝试过,然后应用正常工作。

                                   <activity
                                          android:name="com.xxx.xxx.MainActivity"
                                  

                                  【讨论】:

                                    【解决方案22】:

                                    试试去

                                    • 右键项目
                                    • Java 构建路径
                                    • 来源
                                    • 右侧 -> 添加文件夹按钮
                                    • 选择 libs 文件夹并确定

                                    希望对你有帮助。

                                    【讨论】:

                                      【解决方案23】:

                                      解决方案:

                                      1. 列表项
                                      2. 检查出口订单
                                      3. 启用多敏捷
                                      4. 检查布局中视图的 api 级别。我在 searchView 上遇到了同样的问题。我在添加 searchview 时检查了 api 级别,但在类文件中添加了实现 SearchView.OnQueryTextListener。

                                      【讨论】:

                                        【解决方案24】:

                                        1) 在 Manifest 文件中提及您的活动名称和操作,然后 也是类。 2)在您的活动中提及您的起始内容视图 并在活动中提及您的视图 ID。

                                        【讨论】:

                                        • 有人错误地将其标记为不是答案。这是对答案的尝试,因此有资格作为答案。如果您不喜欢这个答案,正确的做法是否决它(因为其他 5 人已经拥有),而不是标记它。看到你的答案在另一个城堡 - 当答案不是答案时:meta.stackexchange.com/questions/225370/…
                                        猜你喜欢
                                        • 1970-01-01
                                        • 2012-08-03
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2011-12-21
                                        • 1970-01-01
                                        • 2013-08-27
                                        • 2014-07-01
                                        相关资源
                                        最近更新 更多