我使用eclipse进行Google Android开发。
我已经创建了一个库项目(android设置中的[x] Is Library
),其中包括一个外部jar文件(参考库)。这个库项目在另一个项目中被引用(实际的项目将使用库项目)。这是通过在Android-settings下添加项目来完成的。
源代码编译,但如果我想在设备上执行它,我得到NoClassDefFoundError的类是在jar文件中,包含在库项目。
Edit:添加到导出条目的jar文件列表([x] my.jar
在库项目的Order and Export
-选项卡上)
是否有一种干净的方法来让它工作?
这在官方API中已经明确说明了:
库项目可以包含JAR库
您可以开发一个本身包含JAR库的库项目,但是您需要手动编辑依赖应用程序项目的构建路径并向JAR文件添加路径
jar库必须手动添加到依赖于的应用程序项目的构建路径中,而不仅仅是库项目的构建路径本身。
从SDK r17更新:
现在由ADT自动处理,查看ADT 17.0.0版本的新功能:
添加了自动设置JAR依赖项的功能。/libs文件夹中的任何.jar文件都被添加到构建配置中(类似于Ant构建系统的工作方式)。此外,库项目所需的.jar文件也会自动添加到依赖于这些库项目的项目中。(更多信息)
对于那些遵循步骤(甚至检查"Order and Export"中的项目)并且在API 17中仍然有Java .lang. classnotfoundexception的人来说,最后一步是检查您的编译器是否不能在Java 1.7中运行。如果是1.7,那么你应该在所有项目中将其改为1.6。之后,它会要求重建所有项目,并成功运行在我的手机上:)
要更改eclipse中的java编译版本,这位于:项目属性> java编译器>编译器遵从级别:1.6
转到project properties -> build path-> libraies
如果你看到你的jar文件是这样的
snmp4j.jar - e:softwarejars
可能是你的问题
在项目中添加libs文件夹并复制该文件夹中的jar文件。右键单击jar file并选择build path -> add to build path
。然后你可以看到你的jar为
snmp4j.jar - project_name/libs
这对我有用。
我有两个项目使用相同的库:一个工作,另一个崩溃与java.lang.NoClassDefFoundError
。在没有其他帮助之后,我查看了项目根目录中的文件project.properties
。工作项目有android.library.reference
行(下面的最后一行),崩溃的项目没有:
# Project target.
target=android-17
android.library.reference.1=../my-library-project
我手动添加行,它开始工作!(是的,我确实尝试了(项目)属性—java构建路径—项目和(项目)属性—java构建路径—命令和导出—没有任何帮助。)
PS顺便说一下,"项目属性"也有"项目参考"选项卡。不知道会不会成功。
当我升级到ADT17时,我遇到了一个小问题,我的库没有被正确导入。事实证明,这是因为我的库被链接为依赖从我的lib文件夹而不是lib !
似乎库必须在libs文件夹从现在
我有一个类似的问题和非解决方案在这里修复它。
短版本: JAR是在Java 1.7
中编译的,Dalvik找不到。
我们构建了一个内部JAR,通过Maven在后端和移动客户端之间共享。最终的问题是JAR是用Java 1.7编译的。android dalvik只支持Java 1.5和1.6。这就是为什么在Eclipse中一切都很好,因为它还没有被编译成dalvik。
我们甚至在Maven编译器插件中指定了目标和源版本,以便用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:
参数,查看实际编译JAR的Java版本。
另一件要注意的事情是库包的名称。
如果你正在使用ADT21,你碰巧有相同的包名库,在编译过程中会出现错误,但它仍然会在Eclipse中编译和运行,给你一个缺少一些资源类的APK。因此,当你运行应用程序时崩溃。
如果你用ANT编译它,那么你会看到编译错误,说两个或多个库使用相同的包名。
要解决这个问题,使用Android Tools -> rename Application Package重命名库项目。然后一切都会恢复正常。
我花了几乎一整天的时间才弄明白这个问题。