为什么我的Android应用程序在使用一个特定库时会崩溃并显示NoClassDefFoundError?

4
我有一个Android应用程序项目(A)和一个Android库项目(L)。A使用L作为库。
库项目L已经使用了几个外部库:Apache Commons Codec 1.7,Apache Commons Lang3 3.1,Android Support库V4和ActionBarSherlock 4.0。所有这些库以及调用它们的代码都运行得非常好,并且一直运行良好。
然而,我最近添加了一个库:Apache Commons IO 2.4。现在,每当库代码(在L中)尝试调用Commons IO中的方法时,我的应用程序就会崩溃。
我添加IO库的方式与添加其他任何外部库完全相同:build path 当我的应用程序首次启动时,我收到以下信息:
11-01 12:32:14.243: I/dalvikvm(3815): Could not find method org.apache.commons.io.FileUtils.copyInputStreamToFile, referenced from method au.com.grdc.alib.helpers.LibraryCommon.download
11-01 12:32:14.243: W/dalvikvm(3815): VFY: unable to resolve static method 7039: Lorg/apache/commons/io/FileUtils;.copyInputStreamToFile (Ljava/io/InputStream;Ljava/io/File;)V

之后我得到:

11-01 14:50:48.913: E/AndroidRuntime(10030): FATAL EXCEPTION: AsyncTask #1
11-01 14:50:48.913: E/AndroidRuntime(10030): java.lang.RuntimeException: An error occured while executing doInBackground()
...
11-01 12:35:10.268: E/AndroidRuntime(4493): Caused by: java.lang.NoClassDefFoundError: org.apache.commons.io.FileUtils
11-01 12:35:10.268: E/AndroidRuntime(4493):     at au.com.grdc.alib.helpers.LibraryCommon.download(LibraryCommon.java:89)

我看到有人建议将我的"lib"文件夹重命名为"libs",我已经这样做了 - 但这并没有解决问题。

我还看到建议将外部库标记为可导出内容,我也做了,但这也没有解决问题。


2
你是否在导出这个库?请检查右侧的选项卡。 - doublesharp
@doublesharp 是的,所有的库都被标记为可导出。 - George
1
看一下这个<a href="https://dev59.com/5Gsz5IYBdhLWcg3wTl0T#12796510">链接</a>。它会帮助你的。 - Senthil
@vsk 感谢提供链接,但是它并没有帮到我 - 我所有的库都是使用相对路径添加的,而不是绝对路径。请参见 http://pastebin.com/raw.php?i=JuwzrW9M 获取我的 .classpath 文件的副本。 - George
1
@George,请问commons-io jar是否在你的项目Android依赖项中列出? - doublesharp
显示剩余3条评论
2个回答

5
  1. 更新您的eclipse-android-plugin和android-tools(他们已经改变了一段时间如何处理库)
  2. 确保您的项目中有'libs'(而不是'lib')文件夹。
  3. 将所有库jars放在'libs'文件夹中。
  4. 确保'libs'文件夹中的库jars未像在普通java项目中那样添加到构建路径中。Android将自动添加它们。如果查看Project > Properties > Java Build Path > Libraries:
    1. 确保顶层没有单个库jar(否则请删除它们)
    2. 检查是否有一个名为“ Android Dependencies”的自动创建的顶级依赖组。
    3. 检查所有来自libs文件夹的jar是否已自动添加到“ Android Dependencies”组中

对于(A)和(L),都执行以上步骤。

还要确保(A)没有(L)的普通Java风格的项目依赖关系。 Project > Properties > Java Build Path > Projects for (A) 不应列出(L),否则请删除。

确保 Project > Properties > Android for (A) 在Library部分列出项目(L),否则请添加。


如果您需要有关其中一步的更详细帮助,请告诉我。 - forgemo
升级 Eclipse / ADT / SDK 看起来解决了问题(当然,在此之后我按照你的建议进行了其他操作)。我仍然对于为什么所有其他 Apache Commons 库都能在旧环境中工作,只有这个库出现了问题感到困惑。谢谢你的答复。 - George

0

可能是因为org.apache.commons.io.FileUtils存在于多个JAR包中,JVM无法确定使用哪一个。您能够进行交叉检查吗?


我只添加了一次Commons IO Jar,我怀疑其他任何Jar都不会包含org.apache.commons.io包。有没有简单的方法来进行双重检查? - George
按下Ctrl+Shift+T,然后输入完整的类名,例如org.apache.commons.io.FileUtils。您将获得一个结果,显示该类在您的类路径中存在于哪个jar包中。 - Ashish
谢谢@Ashish - 我已经这样做了,唯一显示的jar是libs/commons-io-2.4.jar。截图请见http://i.imgur.com/TZc43.png。 - George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接