【问题标题】:NoClassDefFoundError HtmlunitNoClassDefFoundError Htmlunit
【发布时间】:2017-10-11 10:51:52
【问题描述】:

我是 HtmlUnit 的新手。我尝试了一个使用 htmlunit 加载网页的简单代码,并使用 xpath 获取特定的 div 标签。 xpath 是正确的。我已经使用控制台进行了验证。

到目前为止我尝试的代码是

import java.util.List;

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class Test {

public static void main(String s[]) throws Exception 
{
    WebClient client = new WebClient();
    HtmlPage page = client.getPage("http://jpu1.pv.sv.nextag.com/serv/iinedan/buyer/outPdir.jsp?search=camera");

    List<?> items = page.getByXPath("//div[contains(@class,'search-result-cards')]//div[contains(@class,'listContainer')]");

    for(HtmlElement item : (List<HtmlElement>)items)
    {
        List<?> imageContainer;

        imageContainer = item.getByXPath("//div[contains(@class,'imageContainer')]/a");

        System.out.println("Image container data length : "+imageContainer.size());

        System.out.println("Image "+imageContainer.toString());

    }

  }

}

但是当我执行这段代码时,我遇到了以下异常。

Exception in thread "main" java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at Test.main(Test.java:11)
Caused by: java.lang.ClassNotFoundException: 
org.w3c.dom.ElementTraversal
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 37 more

它似乎喜欢它的配置问题。我从该站点下载了 jar 并将其添加到我的引用库中。我使用的IDE是eclipse。 HtmlUnit 版本为 htmlunit-2.13.jar

【问题讨论】:

标签: java htmlunit


【解决方案1】:

htmlunit 所依赖的库 xml-apis-1.4.01.jar 中存在的 org/w3c/dom/ElementTraversal。因此,作为一种解决方案,您需要将此 jar 放入项目的类路径中。

但是,htmlunit 取决于库的数量。在解决当前错误后,您可能会收到其他类的 noClassDefFoundError。

为了轻松解决它,开始使用 Maven。

  1. 创建一个 Maven 项目。
  2. 在 pom.xml 中添加一个 htmlunit 依赖项,如下所示:

    <dependencies>
    <dependency>
        <groupId>net.sourceforge.htmlunit</groupId>
        <artifactId>htmlunit</artifactId>
        <version>2.13</version>
    </dependency>
    </dependencies>
    
  3. 现在创建一个新类并在其中添加您的代码。

Maven 将确保任何库的所有传递依赖项都可用,并自动将它们保存在项目类路径中(如果在 IDE 中)。

【讨论】:

  • 谢谢@shinchan,这是因为我直接创建了一个普通的java项目并手动添加了jar。这是一个依赖问题。
  • 对我来说,Maven 没有遮蔽它...如何解决这个问题?
  • 你的意思是,依赖项没有出现在最终构建的工件文件夹中?
【解决方案2】:

很多jar包都包含org.w3c.dom.ElementTraversal.
xml-apisbatik-extjython
我认为 jar 包冲突可能会导致您的问题。
能否提供更多jar包版本详情?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2011-06-05
    • 1970-01-01
    • 2011-05-15
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多