发布于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包打架了。那么,该怎么快速定位并解决这个问题?
定位冲突包,思路其实很明确——从Ma ven的依赖树入手。

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

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

找到冲突包之后,怎么处理?方法其实很简单——在Ma ven的依赖声明里,用 exclusions 标签把冲突的那个依赖排除掉。举个例子:
org.apache.poi poi-ooxml ${poi.version} org.apache.poi poi
通过这种方式,你可以精确地告诉Ma ven:“这个传递进来的依赖,我不要了。”
回过头来看,Ma ven解决Jar包冲突,本质上靠的就是三招:依赖调解、依赖排除和依赖范围。
依赖调解的机制很简单——谁离得近谁就顶上去。但有时候,近的不一定是合适的,这时候就得手动上 exclusions 把不想要的版本剔除。至于依赖范围,主要用来控制Jar包在编译、测试、运行时是否生效,能帮你在源头减少不必要的冲突。
关键是,要在POM文件中把这些配置做得清晰、稳定。依赖树不乱,项目跑起来才踏实。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8