Android中的java.lang.NoClassDefFoundError:org.jsoup.Jsoup错误

8

我使用的是Eclipse版本:Indigo服务发布2构建ID:20120216-1857。 Android版本为2.2。 我创建了一个应用程序来测试连接并解析网站,类似于以下内容:

public class TestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    try {
        Document doc = Jsoup.connect("http://example.com/").get();
        Elements divs = doc.select("div#test");

    for (Element div : divs) {
            System.out.println(div.text());
    }
    } catch (Exception e) {
    }
    }
}

清单文件:

android:installLocation="preferExternal"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".TestActivity"
        android:label="@string/app_name"
    android:configChanges="orientation"
    >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>            
        <uses-library android :name="org.jsoup.Jsoup" />
    </activity>
</application>

我将库jsoup-1.6.1.jar添加到JAVA Buildpath,但我遇到了运行时错误:E/AndroidRuntime(736): java.lang.NoClassDefFoundError: org.jsoup.Jsoup 如何解决这个错误?

这个主题标题应该包含与问题 ADT 17 相关的词汇。 - deadfish
抱歉,我必须说出来:“对不起,您不能享用汤!” - Michael Levy
8个回答

19
在最近更新Android的ADT组件后,我遇到了这个确切的问题。似乎Android忽略了构建路径,而是使用ANT默认值。
我通过将我的JAR文件从构建路径中移除,在应用程序层次结构的“根”旁边(与src、gen等并列)创建一个名为“libs”的文件夹,并将我的.jar文件放在那里来解决这个问题。当您进行清理/构建并重新启动应用程序时,错误应该会消失。
FYI-这是因为JAR文件未打包到.apk文件中-这就是为什么它可以正确构建,但在Android设备上的运行时不可用的原因。
参见:NoClassDefFoundError-Eclipse和Android

1
这不是一个权宜之计 - 这是你应该做的。请参见https://dev59.com/0Gkw5IYBdhLWcg3wirCs#9824539 - CommonsWare
红色,请确保将其标记为“已接受”如果它帮助了你。Mark(commonsware)-谢谢您的提示。我会将其除去。 - John O'Connor
抱歉打扰你,但我使用了compile 'org.jsoup:jsoup:1.8.3',但是它仍然出现相同的错误。我该怎么办? - Aawaz Gyawali

3

还有一个问题,就是JAR文件必须放在libs(含's')目录中而不是lib目录中...这可能是你遇到的问题吗?


2
  1. 右击项目名称 > 属性 > Java Build Path > 标签库,然后单击“添加外部jar”按钮。
  2. 从已下载jsoup-1.7.3.jar的目录中选择jar文件路径。
  3. 添加完jar文件后,转到下一个标签页“Order and Export”,选中复选框jsoup-1.7.3.jar,点击确定。
  4. 清理构建项目,然后运行。

我通过上述步骤解决了同样的问题。


2
你不需要这行代码:
 <uses-library android:name = "org.jsoup.Jsoup"/>  

在您的清单文件中,要使用Jsoup只需执行以下操作以确保它是构建路径的一部分:
  • 右键单击项目并选择属性
  • 选择Java Build Path并选择添加外部JAR文件...
  • 导航到Jsoup jar文件
然后,Jsoup将像Java中的任何其他库一样运行。例如,在我的应用程序中,我使用它的方式如下:
    try 
    {
                    Document doc = Jsoup.connect( myHtml ).get();

                    Elements table = doc.select( "table#ctl00_ContentPlaceHolder1_tblPasses" );

                    // Returns first row of the table which we want
                    Elements row = table.select( "tr.lightrow" );
                    Element record_One = row.first();
    }

注意 - 我没有包含所有的代码,因为它相当长。无论如何,在那之后你只需要按需导入类,例如在我的代码中我使用以下方式:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

1
选择Java构建路径并选择添加外部JAR文件...这对于R17工具来说非常错误。所有第三方JAR文件需要在项目的“libs /”目录中,并且现在不需要手动添加到构建路径中。 - CommonsWare
https://dev59.com/0Gkw5IYBdhLWcg3wirCs#9824539 - CommonsWare
谢谢。我还以为我的第一个答案很好呢...哦,好吧,回到业余的安卓绘图板上。 - Katana24

1
你做错了。在Activity的onCreate中不能使用Jsoup函数,需要使用Async Task或线程。
这是为了防止在Activity中执行阻塞任务。
以下是一篇很好的博客文章,解释了如何使用它并提供了示例代码。 点击此处查看示例代码

1

我按照以下步骤解决了这个问题:

  1. 将jsoup jar包放置在“libs”文件夹中(如John的答案中所述)
  2. 从构建路径中删除“Android Dependencies”和“Android Private Libraries”
  3. 使用Android工具>修复项目属性,重新填充构建路径中的上述条目。

0

只需关闭Eclipse并重新打开即可解决问题。


0

我的解决方案是

  1. 右键单击项目名称 > 属性 > Java Build Path >选项卡Libraries > 删除除了 "Android X.X" (在我的情况下是2.3.3) 和 "Android Dependencies" (根据@KarlKarlsom找到的链接>android.foxykeep.com<来自于stack问题>stack<)以外的所有内容。
  2. 我在我的主要项目中创建了一个名为libs的文件夹。由于我使用了jsoup,因此我将它移到了这个文件夹中。
  3. 重新启动eclipse,清理项目没有起作用。

附言:我使用了jsoup和sherlock。我没有改变sherlock库,只改变了我的主要项目。


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