0

我正在使用 Maven/Eclipse 在 Java 中编程。

从单元测试运行时,我能够很好地运行 HtmlUnit。(测试/)

但是,当我尝试在 src/ 文件夹中使用相同的代码时,我会收到java.lang.NoClassDefFoundError消息。我能够解决它们的唯一方法是手动将所有 jar 添加到构建路径中。但这对我来说没有意义,因为 jar 文件显示在我的 Maven 依赖项中。

pom.xml (实际的 pom 文件中有更多的依赖项)

<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.9</version>
    <scope>test</scope>
</dependency>

HtmlUnit 代码示例块

WebClient webClient = new WebClient();
HtmlPage page = webClient.getPage(url);
System.out.println("Executing Pages JavaScript for " + config.executeJavaScriptTime + " seconds...");                       webClient.waitForBackgroundJavaScript(config.executeJavaScriptTime);
dom = cleaner.clean(page.asXml());
html = cleaner.getInnerHtml(dom);
webClient.closeAllWindows();

有任何想法吗?谢谢。

4

2 回答 2

2

应用于您的依赖项的测试范围意味着它在编译类路径中不可用。这样,您发布的代码不依赖于测试代码。更完整的解释可以在这里找到。如果您正在构建的项目仅用于测试,则应删除范围标记以使其采用默认范围,编译。但总的来说,从 src 构建的传送代码不应该依赖于测试库 JUnit,这是正确的。

于 2012-05-30T01:04:00.903 回答
0

到目前为止,我发现的唯一可行的方法是创建一个注释为的方法@Test并将爬虫作为 JUnit 测试运行。

IE

public class Crawler() {

    @Test
    public void runAsTest() {
        Crawler crawler = new Crawler();
        String[] urls = new String[]{
                "http://www.url.com/1",
                "http://www.url.com/2",
                "http://www.url.com/3"
            };
        crawler.crawl(urls);
        try {
            Thread.sleep(1000 * 60 * 15); // without this the unit test exits too early
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

  // the rest of the class definition

}

我希望能够从标准的主要方法运行它,即

public class Crawler() {

    public static void main(String[] args) {
        Crawler crawler = new Crawler();
        String[] urls = new String[]{
                "http://www.url.com/1",
                "http://www.url.com/2",
                "http://www.url.com/3"
            };
        crawler.crawl(urls);
        try {
            Thread.sleep(1000 * 60 * 15); // without this the unit test exits too early
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

  // the rest of the class definition

}
于 2012-05-30T01:03:50.777 回答