2011-11-03 66 views
17

我使用eclipse进行Google Android开发。针对Android的外部库项目的NoClassDefFoundError

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

源代码编译,但如果我想在设备上执行它,我会得到一个类为的类中的NoClassDefFoundError,它包含在库项目中包含的jar文件中。

编辑:的JAR文件IST加入到(上Order and Export -Tab [x] my.jar从库项目)导出的条目

有没有干净的方式来得到这个工作?

+0

你确定未找到的类是在引用的jar吗? java jar中引用的常规Java类存在很多问题,但不在Dalvik中,比如某些javax和lava.beans类 – kostja

+0

如果它在jar中,是否将jar添加到了导出的项目中? – kostja

+0

@kostja:是的,我修改了我的问题。 – Fu86

回答

15

它已offcial API here已经明确提出:

库项目可以包括JAR库

你可以开发一个库项目,本身包括JAR库,不过你需要手动编辑从属应用程序项目的构建路径并添加JAR文件的路径

必须将jar库手动添加到从属应用程序中它不仅仅是图书馆项目的构建路径本身,而且还包括的构建路径。从SDK R17

更新:

这是自动ADT现在处理的,看看新特性,ADT 17.0.0版本here

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

+1

这意味着使用jar文件的库项目的主项目也必须在Java Build Path中包含jar文件,并在Order和Export选项卡中将其打勾......我花了很长时间添加项目和jar文件没有用..建立好但运行时noclassdeffoundexception – Zennichimaro

1

我有一个小问题,当我升级到ADT17时,我的库没有正确导入。原来,这是因为我的图书馆被链接为我的lib文件夹而不是libs的依赖关系!

好像图书馆的必须在libs文件夹从现在

+0

有相同的。更多细节:http://stackoverflow.com/questions/9885971/new-android-sdk-17-issue-in-my-app – Remi

2

转到project properties -> build path-> libraies

如果你看到这样

snmp4j.jar - e:\software\jars 

它可能您的问题

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

snmp4j.jar - project_name/libs 

它为我工作。

7

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

要改变Eclipse的Java编译版本,这个坐落在:项目属性> Java编译器>编译器的级别:1.6

+1

为什么我们需要这样做? – Nezam

+0

+1非常好,这解决了我的问题。疯狂这应该发生在第一位,虽然... –

+0

+1这工作,但在我的情况,这是我只需要重建。谢谢。 = d – Suzi

0

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

如果您使用的是ADT21,并且您碰巧拥有相同软件包名称的库,那么在编译过程中会出现错误,但它仍然会在Eclipse中编译和运行,为您提供缺少某些资源类的APK 。因此,当你运行应用程序时发生崩溃。

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

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

我花了几乎整整一天摸不着头脑......

2

我不得不使用相同的库两个项目:一个工作,另一个与java.lang.NoClassDefFoundError崩溃。 在没有其他人帮助我之后,我查看了我项目根目录下的文件project.properties。 工作项目有android.library.reference线(下面的最后一行),崩溃的一个都没有:

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

我手动添加的行,它开始工作! (是的,我曾尝试都(项目)属性 - Java构建路径 - 项目(项目)属性 - Java构建路径 - 订单和出口 - 没有任何帮助)

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

1

我有一个类似的问题,非解决这里的解决方案。

简短版本: JAR编译为Java 1.7,Dalvik找不到它。

我们构建了一个内部JAR,我们通过Maven与后端和移动客户端共享。最终的问题是JAR是用Java 1.7编译的。 Androids dalvik仅支持Java 1.5和1.6。这就是为什么Eclipse中的所有东西都能正常工作的原因,因为此时它不会编译到达尔维克。

我们甚至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。

相关问题