这个问题是典型的 JAR 包类冲突(Classpath Conflict):
强制让正确版本的类被优先加载
Maven 默认按 依赖声明顺序 和 依赖深度 决定类路径顺序("nearest wins")。你可以:
✅ 在 pom.xml 中 先声明 依赖A,再声明 依赖B
XML
<dependencies>
<!-- 先声明你想要的版本 -->
<dependency>
依赖A
</dependency>
<!-- 后声明 (它的 Utils 会被忽略) -->
<dependency>
依赖B
</dependency>
</dependencies>
📌 Maven 的"最近优先"原则 :如果两个依赖提供同名类,在 classpath 中排在前面的 JAR 会被优先加载 。
虽然 Maven 不保证严格顺序,但在大多数情况下,先声明的依赖会排在前面。
🔍 如何确认哪个 Utils 被加载?
在代码中加一行调试:
XML
System.out.println(Utils.class.getProtectionDomain().getCodeSource().getLocation());
输出会告诉你这个类来自哪个 JAR 文件
用 <exclusion>(如果可行)
XML
<dependency>
依赖B
<exclusions>
<exclusion>
<groupId>org.xx</groupId>
<artifactId>*</artifactId>
</exclusion>
<!-- 或具体排除 -->
<exclusion>
<groupId>org.xx.tool</groupId>
<artifactId>xx-xx-xx</artifactId>
</exclusion>
</exclusions>
</dependency>
⚠️ 如果
xx-xx-xx内部直接打包了 class(不是依赖),<exclusion>无效。