商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Maven依赖冲突问题及解决过程

Maven依赖冲突问题及解决过程

  发布于2026-07-10 阅读(0)

扫一扫,手机访问

引言

开发过程中,Ma ven依赖冲突其实是个挺常见的问题。很多时候,打包出来的Jar包看起来能正常启动,但只要一运行到涉及冲突包里的具体功能,马上就会暴露问题。比如下面这个经典报错:

ja va.lang.NoClassDefFoundError: org/apache/poi/util/POILogFactory

at org.apache.poi.hwpf.model.FileInformationBlock.(FileInformationBlock.ja va:52) ~[poi-scratchpad-4.1.2.jar!/:4.1.2]

at org.apache.poi.hwpf.HWPFDocumentCore.(HWPFDocumentCore.ja va:170) ~[poi-scratchpad-4.1.2.jar!/:4.1.2]

at org.apache.poi.hwpf.HWPFDocument.(HWPFDocument.ja va:193) ~[poi-scratchpad-4.1.2.jar!/:4.1.2]

at org.apache.poi.hwpf.HWPFDocument.(HWPFDocument.ja va:177) ~[poi-scratchpad-4.1.2.jar!/:4.1.2]

at org.apache.poi.hwpf.HWPFDocument.(HWPFDocument.ja va:165) ~[poi-scratchpad-4.1.2.jar!/:4.1.2]

at com.zxx.hand.WordHandler.handContent(WordHandler.ja va:47) ~[classes!/:1.0]

at com.zxx.hand.DocumentAttachmentHandler.getAttachmentInfo(DocumentAttachmentHandler.ja va:51) ~[classes!/:1.0]

at com.zxx.elasticsearch.FileAnalysisElasticsearchTask.fileAnalysis(FileAnalysisElasticsearchTask.ja va:64) ~[classes!/:1.0]

at com.zxx.service.impl.FileAnalysisServiceImpl$1.run(FileAnalysisServiceImpl.ja va:50) ~[classes!/:1.0]

at ja va.base/ja va.util.concurrent.Executors$RunnableAdapter.call(Executors.ja va:515) ~[na:na]

at ja va.base/ja va.util.concurrent.FutureTask.run(FutureTask.ja va:264) ~[na:na]

at ja va.base/ja va.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.ja va:304) ~[na:na]

at ja va.base/ja va.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.ja va:1128) ~[na:na]

at ja va.base/ja va.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.ja va:628) ~[na:na]

at ja va.base/ja va.lang.Thread.run(Thread.ja va:834) ~[na:na]

Caused by: ja va.lang.ClassNotFoundException: org.apache.poi.util.POILogFactory

at ja va.base/ja va.net.URLClassLoader.findClass(URLClassLoader.ja va:476) ~[na:na]

at ja va.base/ja va.lang.ClassLoader.loadClass(ClassLoader.ja va:588) ~[na:na]

at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.ja va:151) ~[nnd-document-parser.jar:1.0]

at ja va.base/ja va.lang.ClassLoader.loadClass(ClassLoader.ja va:521) ~[na:na]

... 15 common frames omitted

从堆栈信息可以看到,问题出在POI库的某个日志工厂类找不到了。这种情况,十有八九是项目中不同版本的POI包打架了。那么,该怎么快速定位并解决这个问题?

1、找出冲突包

定位冲突包,思路其实很明确——从Ma ven的依赖树入手。

1.1 找到pom.xml文件

Ma ven依赖冲突问题及解决过程

1.2 点击Show Diagrams查看依赖图

在IDEA中,右击 pom.xml 文件,选择 Show Diagrams

Ma ven依赖冲突问题及解决过程

这时候,IDEA会生成一张依赖图,冲突的依赖会被高亮或特别标记出来。

Ma ven依赖冲突问题及解决过程

2、移除冲突包

找到冲突包之后,怎么处理?方法其实很简单——在Ma ven的依赖声明里,用 exclusions 标签把冲突的那个依赖排除掉。举个例子:

        
            org.apache.poi
            poi-ooxml
            ${poi.version}
            
            
                
                    org.apache.poi
                    poi
                
            
        

通过这种方式,你可以精确地告诉Ma ven:“这个传递进来的依赖,我不要了。”

总结

回过头来看,Ma ven解决Jar包冲突,本质上靠的就是三招:依赖调解依赖排除依赖范围

依赖调解的机制很简单——谁离得近谁就顶上去。但有时候,近的不一定是合适的,这时候就得手动上 exclusions 把不想要的版本剔除。至于依赖范围,主要用来控制Jar包在编译、测试、运行时是否生效,能帮你在源头减少不必要的冲突。

关键是,要在POM文件中把这些配置做得清晰、稳定。依赖树不乱,项目跑起来才踏实。

本文转载于:https://www.jb51.net/program/363081tcs.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注