關於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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM