IDEA解決maven包沖突easypoi NoClassDefFoundError的問題
在平常工作中我們經(jīng)常會(huì)遇到maven引用的jar包沖突的事情,這時(shí)候我們就需要找出沖突的包,并將低版本或者缺少某些方法的jar給剔除掉。這個(gè)時(shí)候使用idea自帶的maven依賴樹就很好解決這樣的問題。
包沖突顯現(xiàn)出來的問題有:某些類找不到。
原因:工程中引入了一個(gè)需要的依賴,但工程中其他依賴的包內(nèi)部也可能會(huì)有相同的依賴,如果版本不同maven可能取了一個(gè)低的版本,然后可能造成某個(gè)類找不到。
比如:
在工程中引入了easypoi jar,要使用Excel導(dǎo)出功能。
<dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.1.2</version> </dependency> 上述jar 內(nèi)部依賴 apache-poi 版本 4.1.0 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version> </dependency>
我的工程中有個(gè)公司的公用的jar,內(nèi)部依賴了apache-poi 3.x
編寫代碼時(shí)沒問題,運(yùn)行調(diào)用相關(guān)接口報(bào)錯(cuò)如下
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/hssf/util/HSSFColor$HSSFColorPredefined
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at cn.huimin100.account.manager.main.filters.RequestWrapperFilter.doFilterInternal(RequestWrapperFilter.java:24)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:109)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
發(fā)現(xiàn)找不到是個(gè)內(nèi)部類,搜索主類發(fā)現(xiàn)主類所在的jar版本為3.9,這就是jar版本沖突造成的問題。
解決步驟:
1.在IDEA中右鍵項(xiàng)項(xiàng)目的pom文件,選擇Maven->Show Dependencies,會(huì)打開一個(gè)maven的依賴樹窗口,如下:
2.打開窗口我們可以看到完整的依賴樹,小技巧: 左上角有幾個(gè)小工具,比較常用的1顯示沖突項(xiàng),2顯示從root到被選擇的jar包路徑,3顯示實(shí)際大小。要選擇沖突項(xiàng)的話可以直接點(diǎn)擊1,然后在點(diǎn)擊3,顯示的會(huì)更清楚一些,因?yàn)閖ar包比較多,jar依賴比較復(fù)雜會(huì)讓圖變得很小。之后如果你需要看這個(gè)jar的引用路徑可以點(diǎn)擊這個(gè)jar包再點(diǎn)擊2,就回顯示從pom文件的根路徑的包到被選擇的包的單條路線,很方便 ;
3.找到?jīng)_突的包后,選擇需要的那個(gè)jar包,右鍵要去除的那個(gè)jar包,點(diǎn)擊exclude。
紅色虛線代表沖突,而且標(biāo)了相應(yīng)版本。
就會(huì)在pom文件中被剔除(其實(shí)就是對應(yīng)的pom中的exclusion)
這樣,就解決了jar版本沖突問題。
其他小技巧:
1.在依賴樹使用ctrl/command+f是可以直接搜索jar包的名稱的;
2.在依賴樹的界面使用ctrl/command+鼠標(biāo)滾輪是可以放大縮小依賴樹的比例,同樣使用鍵盤上的+,-號也可以做到這個(gè);
3.alt/option按住,然后鼠標(biāo)在依賴樹上滑動(dòng),是可以達(dá)到放大鏡的效果的;
4.在依賴樹上雙擊是可以直接跳轉(zhuǎn)到該jar的引入位置。
參考
https://segmentfault.com/a/1190000019364264
到此這篇關(guān)于IDEA解決maven包沖突easypoi NoClassDefFoundError的問題的文章就介紹到這了,更多相關(guān)IDEA maven包沖突內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android選擇與上傳圖片之Matisse教程
- SpringBoot異常: nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext解決方案
- Android Studio 升級到3.0 提示 java.lang.NoClassDefFoundError的解決方法
- java.lang.NoClassDefFoundError錯(cuò)誤解決辦法
- Android 出現(xiàn):java.lang.NoClassDefFoundError...錯(cuò)誤解決辦法
- Exception in thread main java.lang.NoClassDefFoundError錯(cuò)誤解決方法
- 解決java.lang.NoClassDefFoundError: android.support.v4.animation.AnimatorCompatHelper問題
相關(guān)文章
JDBC下Idea添加mysql-jar包的詳細(xì)過程
這篇文章主要介紹了JDBC下Idea添加mysql-jar包的詳細(xì)過程,添加jar包首先到官網(wǎng)下載jar包,然后idea導(dǎo)入jar包,在就是檢查,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11eclipse中自動(dòng)生成javadoc文檔的方法
這篇文章主要介紹了eclipse中自動(dòng)生成javadoc文檔的方法,是實(shí)用eclipse開發(fā)Java程序時(shí)非常實(shí)用的技巧,對于進(jìn)行Java項(xiàng)目開發(fā)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12mybatis中的mapper.xml使用循環(huán)語句
這篇文章主要介紹了mybatis中的mapper.xml使用循環(huán)語句,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java中Socket設(shè)置連接超時(shí)的代碼分享
在我們?nèi)粘_B接中,如果超時(shí)時(shí)長過長的話,在開發(fā)時(shí)會(huì)影響測試,下面這篇文章主要給大家分享了關(guān)于Java中Socket設(shè)置連接超時(shí)的代碼,需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06Java算法之最長公共子序列問題(LCS)實(shí)例分析
這篇文章主要介紹了Java算法之最長公共子序列問題(LCS),結(jié)合實(shí)例形式分析了最長公共子序列的原理及問題解決方法,需要的朋友可以參考下2017-11-11