关于webmagic的依赖问题:ava.lang.NoClassDefFoundError: org/jsoup/helper/StringUtil

 扩散阅读:依赖冲突详细介绍及其解决方法

在做maven项目的过程中,不知道大家会不会遇到这样的问题,明明代码方面没有什么问题,但是在运行的时候就会报出诸如 java.lang.ClassNotFoundExceptionjava.lang.NoSuchMethodErrorjava.lang.NoSuchFieldError 等问题。出现这种问题很大一部分可能是由于项目中产生了依赖冲突。

依赖冲突

假如在项目中引用d到了两个第三方提供的包 a.jar 和 b.jar , 其中a.jar 包中引用了一个 c.jar ,假设这个 c.jar 为0.1版本。此时项目引用的b.jar 中也引用了 c.jar ,但是这里的 c.jar 包的版本为0.2版本,比 a.jar 中的 c.jar 版本更高。b.jar 中某个类引用了 c.jar 的类 classA 中的方法 method A() ,并且该方法只存在于高版本的 c.jar(0.2版本) 的类 classA 中,而不存在c.jar(0.1版本) 的类 classA 中。

当系统编译加载时,由于maven对jar包的依赖次序不同,系统可能编译加载 c.jar(0.1版本) ,也可能编译加载 c.jar(0.2版本) ,当编译加载c.jar(0.2版本) 时,由于很多 jar 包都支持向下兼容,即高版本兼容低版本,因此不论 a.jar 调用 c.jar 还是 b.jar 调用 c.jar 一般都不会出问题。但如果此时刚好应用编译加载的是 c.jar(0.1版本) 中的类 classA 时,那么 b.jar 调用Method A() 时则会报 NoSuchMethodError 异常,因为 Method A() 函数只存在于高版本的 c.jar 中,而此时系统编译加载的却是低版本的 c.jar 。上面所描述的情况便是所谓的依赖冲突问题。

解决办法

解决思路

根据报错的class名或方法名定位到可能导致冲突的jar包(抛出异常后可以搜索下找不到的类或者方法存在于哪个包),然后定位这个jar包在项目中都存在哪些版本,排除掉低版本的jar包,只留下产生冲突jar包的最高版本即可解决。

本题错误原因:
 webMagic自带Jsoup , 在父工程和子工程都被我加上高版本依赖,因没有此方法所以找不到,删除原来高版本jsoup的jar坐标,问题解决

 

Exception in thread "pool-1-thread-1" java.lang.NoClassDefFoundError: org/jsoup/helper/StringUtil
    at us.codecraft.webmagic.selector.LinksSelector.selectList(LinksSelector.java:28)
    at us.codecraft.webmagic.selector.HtmlNode.selectElements(HtmlNode.java:80)
    at us.codecraft.webmagic.selector.HtmlNode.links(HtmlNode.java:37)
    at com.ibaiqi.spider.webMagic.Sqrcw_com_spider.process(Sqrcw_com_spider.java:44)
    at us.codecraft.webmagic.Spider.onDownloadSuccess(Spider.java:414)
    at us.codecraft.webmagic.Spider.processRequest(Spider.java:406)
    at us.codecraft.webmagic.Spider.access$000(Spider.java:61)
    at us.codecraft.webmagic.Spider$1.run(Spider.java:320)
    at us.codecraft.webmagic.thread.CountableThreadPool$1.run(CountableThreadPool.java:74)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.jsoup.helper.StringUtil
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 12 more
超时设置:10000

 

posted @ 2020-03-23 16:59  码哥之旅  阅读(2263)  评论(1编辑  收藏  举报