在Android中出现了NoClassDefFoundError错误...但是该类包含在类路径中的一个jar文件中。

18

我正在开发一款 Android 应用程序。它需要能够拍照并将该照片发送到网页。以下是代码:

HttpClient httpclient = new DefaultHttpClient();

        HttpPost httpPost = new HttpPost("someurl");
        MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); //Here throws the exception
        multipartEntity.addPart("data",
                new InputStreamBody(
                        new ByteArrayInputStream(byteArray),
                        "image/png"));
        multipartEntity.addPart("caption", new StringBody(filename));

        httpPost.setEntity((HttpEntity) multipartEntity);

我在我的ClassPath中有所需的库(httpclient、apache-mime4j-core、httpcore和httpmime)。编译时没有显示任何错误。但是当我运行项目时,它会显示“java.lang.NoClassDefFoundError: org.apache.http.entity.mime.MultipartEntity”,但这个类确实存在于jar包中(in httpMime, exactly)。以下是完整的跟踪信息:

04-09 10:21:59.362: E/AndroidRuntime(10352): FATAL EXCEPTION: main
04-09 10:21:59.362: E/AndroidRuntime(10352): java.lang.NoClassDefFoundError: org.apache.http.entity.mime.MultipartEntity
04-09 10:21:59.362: E/AndroidRuntime(10352):    at     com.publidirecta.AppAzafata.IniciarGPSActivity2.enviarImagen(IniciarGPSActivity2.java:206)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at com.publidirecta.AppAzafata.IniciarGPSActivity2.onActivityResult(IniciarGPSActivity2.java:196)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at android.app.Activity.dispatchActivityResult(Activity.java:3908)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2549)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:2595)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at android.app.ActivityThread.access$2000(ActivityThread.java:121)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:973)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at android.os.Looper.loop(Looper.java:130)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at  android.app.ActivityThread.main(ActivityThread.java:3701)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at java.lang.reflect.Method.invokeNative(Native Method)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at java.lang.reflect.Method.invoke(Method.java:507)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at     com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
04-09 10:21:59.362: E/AndroidRuntime(10352):    at dalvik.system.NativeStart.main(Native Method)

我已经尝试了此任务使用的所有旧版本的jars,但仍然无法工作。这些jars出现在Android项目的“引用库”中。

我尝试了一切。有人知道为什么会发生这种情况吗?我快要跳窗了。

提前感谢您!


创建另一个新项目,将这些类复制到其中并再次尝试... - Suvam Roy
1
请查看此答案,可能会对您有所帮助 | https://dev59.com/vWkw5IYBdhLWcg3wNn-h#10046725 - MAC
我刚刚遇到了这个问题,Eclipse让我引用文件,但是运行时出现错误!不过我重新编译后就可以了.... - James
6个回答

29

您需要在您的项目中创建一个名为libs的文件夹,并将您所引用的jar包复制到该文件夹中。


放入 libs 文件夹后,别忘了 Project > Clean。 - Naskov
我也做了同样的事情,但是我总是得到java.lang.NoClassDefFoundError: org.apache.http.entity.mime.HttpMultipart。 - Issac Balaji

9

由于自动更新失败,我下载了最新版本。但是找不到MultipartEntity类。我又将其重新添加到项目中,并确保它在名为“libs”的文件夹中 - 但是没有成功。Andong提示我检查项目首选项。项目属性 -> Java Build Path -> Order and Export:确保选择Android Private Libraries(我全部选中)。清除项目,问题解决了。


在我的情况下,只需要在“顺序和导出”中检查httpmime;在进行项目清理后,问题就解决了! - GChorn

3

在Eclipse中打开你的项目属性。然后打开“排序和导出”选项卡,确保选择了所有需要的库。最后,点击“项目”>“清理”。这样,你的问题应该就解决了。


3

太奇怪了,我的应用程序已经有了“lib”文件,但还是出现了崩溃。我按照idiottiger的建议将其重命名为“libs”,问题就解决了。


同样的结果。感谢 idiottiger,也感谢 Eclipse 白白浪费了我又两个小时的时间! - Jonesy

2
今天我遇到了一些问题:
a) 我将所有的jar文件放入libs目录中,然后右键单击项目 > 构建路径 > 添加外部jar包 > 选择jar文件。然后去“顺序和导出”,仍然出现了问题。 b) 后来发现httpclient-4.3.1.jar和httpmime-4.3.1.jar不够用,我还需要添加httpcore-4.3.jar。
这样就解决了错误! :D 今天我花了近4个小时来解决这个问题 :(

0
我用以下方法解决了同样的问题:
  1. 打开你遇到这个问题的项目中的pom.xml文件
    java.lang.NoClassDefFoundError: org/apache/http/entity/mime/MultipartEntityBuilder

  2. 在dependencies下,添加以下代码。

      <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.2</version>
            <scope>test</scope>
        </dependency>
    
  3. 清理并重新构建代码。

它会起作用的。


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