我使用eclipse进行谷歌Android开发。
我在Android设置中创建了一个库项目([x] Is Library
),其中包含一个外部jar文件(Referenced Libraries)。此库项目在另一个项目(将使用库项目的实际项目)中引用。这是通过在Android设置下添加项目来完成的。
源代码编译,但是如果我想在设备上执行它,我会在jar文件中的类中获取NoClassDefFoundError,该文件包含在库项目中。
编辑:jar文件已添加到导出的条目([x] my.jar
上的Order and Export
- 来自库项目的标签页
有没有一种干净的方法让这个工作?
答案 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工具重命名您的图书馆项目 - >重命名应用程序包。然后一切都会恢复正常。
我花了差不多整整一天才想出来......