18

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

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

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

编辑:将 jar 文件添加到导出的条目中([x] my.jarOrder and Export库项目的 -Tab 上)

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

4

7 回答 7

15

这里的官方 API 已经明确说明:

一个库项目可以包含一个 JAR 库

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

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

从 SDK r17 更新:

这现在由 ADT 自动处理,请在此处查看 ADT 17.0.0 版本的新功能:

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

于 2011-11-03T20:26:59.303 回答
7

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

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

于 2013-01-02T01:16:38.687 回答
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 

它对我有用。

于 2012-10-09T09:08:45.370 回答
2

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

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

我手动添加了这条线,它开始工作了!(是的,我确实尝试了(项目)属性——java 构建路径——项目(项目)属性——java 构建路径——顺序和导出——没有任何帮助。)

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

于 2013-04-08T11:38:19.207 回答
1

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

从现在开始,似乎库必须在 libs 文件夹中

于 2012-04-06T17:06:13.703 回答
1

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

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

我们构建了一个内部 JAR,我们使用 Maven 在后端和移动客户端之间共享该 JAR。问题最终是 JAR 是用 Java 1.7 编译的。Androids 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 版本。

于 2013-10-07T15:46:00.937 回答
0

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

如果您使用的是 ADT21 并且您恰好有具有相同包名的库,则在编译过程中会出现错误,但它仍然会在 Eclipse 中编译和运行,从而为您提供缺少某些资源类的 APK。因此,当您运行应用程序时会崩溃。

如果你用 ANT 编译它,你会看到编译错误,说两个或多个库使用相同的包名。

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

我花了几乎一整天的时间才弄清楚这个……

于 2013-02-11T05:16:56.177 回答