适用于Android的外部库项目的NoClassDefFoundError

时间:2011-11-03 12:18:30

标签: java android eclipse android-library

我使用eclipse进行谷歌Android开发。

我在Android设置中创建了一个库项目([x] Is Library),其中包含一个外部jar文件(Referenced Libraries)。此库项目在另一个项目(将使用库项目的实际项目)中引用。这是通过在Android设置下添加项目来完成的。

源代码编译,但是如果我想在设备上执行它,我会在jar文件中的类中获取NoClassDefFoundError,该文件包含在库项目中

编辑:jar文件已添加到导出的条目([x] my.jar上的Order and Export - 来自库项目的标签页

有没有一种干净的方法让这个工作?

7 个答案:

答案 0 :(得分:15)

已在官方API here中明确说明:

  

库项目可以包含JAR库

     

您可以开发一个本身包含JAR库的库项目,但是您需要手动编辑相关应用程序项目的构建路径并添加JAR文件的路径

必须手动将jar lib添加到依赖的应用程序项目的构建路径中,而不仅仅是库项目构建路径本身。

从SDK r17更新:

现在由ADT自动处理,请查看ADT 17.0.0发布的新功能here

  

添加了自动设置JAR依赖项的功能。 / libs文件夹中的任何.jar文件都将添加到构建配置中(类似于Ant构建系统的工作方式)。此外,库项目所需的.jar文件也会自动添加到依赖于这些库项目的项目中。 (more info

答案 1 :(得分:7)

对于那些遵循这些步骤的人(甚至检查“Order and Export”中的项目)并且仍然在API 17中有java.lang.ClassNotFoundException,最后一步是检查您的编译器是否不能与Java 1.7一起运行。如果是1.7,则应将其更改为1.6以用于所有项目。之后,它将要求重建所有项目并成功在我的手机上运行:)

要在eclipse中更改java编译版本,它位于:项目属性> Java编译器>编译器合规性级别:1.6

答案 2 :(得分:2)

转到project properties -> build path-> libraies

如果您看到这样的jar文件

snmp4j.jar - e:\software\jars

它可能是你的问题

在项目中添加libs文件夹并复制该文件夹中的jar文件。右键单击jar文件并转到build path -> add to build path。然后你可以看到你的罐子

snmp4j.jar  - project_name/libs 

它为我工作。

答案 3 :(得分:2)

我有两个使用同一个库的项目:一个正在运行,另一个正在使用java.lang.NoClassDefFoundError崩溃。 在没有别的帮助我之后,我查看了项目根目录中的文件project.properties。 工作项目有android.library.reference行(下面的最后一行),崩溃的行没有:

# Project target.
target=android-17
android.library.reference.1=../my-library-project

我手动添加了该行,它开始工作了! (是的,我确实尝试过两个(项目)属性 - java构建路径 - 项目(项目)属性 - java构建路径 - 顺序和导出 - 什么都没有帮助。)

PS 顺便说一下,“项目属性”还有“项目引用”选项卡。不知道它是否会起作用。

答案 4 :(得分:1)

当我升级到ADT17时,我遇到了一个小问题,我的libs没有正确导入。事实证明这是因为我的librarys被链接为我的lib文件夹而不是libs的依赖!

似乎从现在起,librarys必须在libs文件夹中

答案 5 :(得分:1)

我有一个类似的问题,并没有解决方案在这里修复它。

简短版本: JAR是用Java 1.7编译的,Dalvik无法找到。

我们构建了一个内部JAR,我们通过Maven与后端和移动客户端共享。问题最终是JAR是用Java 1.7编译的。 Androids dalvik仅支持Java 1.5和1.6。这就是Eclipse中一切正常的原因,因为此时它还没有编译成dalvik。

我们甚至用specified the target and source version in the Maven compiler plugin来编译Java 1.6。这不起作用,因为只在构建计算机上安装了JDK 1.7。 Maven页面底部的一个小注释给了我们提示:Note: Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version.

要查看您是否也遇到此问题,请将*.jar文件重命名为*.zip将其解压缩,然后在MANIFEST.MF文件中查找Build-Jdk:参数以查看什么Java版本实际编译了你的JAR。

答案 6 :(得分:0)

要注意的另一件事是库包名称。

如果您正在使用ADT21并且您碰巧拥有具有相同软件包名称的库,则在编译期间会出现错误,但它仍将在Eclipse中编译和运行,从而为您提供缺少某些资源类的APK。因此,当您运行应用程序时崩溃。

如果使用ANT编译它,那么您可以看到编译错误,表明两个或多个库使用相同的包名称。

要解决此问题,请使用Android工具重命名您的图书馆项目 - >重命名应用程序包。然后一切都会恢复正常。

我花了差不多整整一天才想出来......