表现 | 说明 |
---|---|
ClassNotFoundException | 类文件存在但版本不兼容 |
NoSuchMethodError | 方法签名在不同版本中不一致 |
NoClassDefFoundError | 依赖的依赖缺失 |
Unexpected Behavior | 不同版本类实现的差异导致逻辑错误 |
# 查看完整依赖树
mvn dependency:tree
# 过滤指定依赖(示例查找guava)
mvn dependency:tree -Dincludes=com.google.guava:guava
示例输出
[INFO] com.example:my-project:jar:1.0.0
[INFO] +- com.moduleA:moduleA:jar:2.0:compile
[INFO] | \- com.google.guava:guava:jar:30.0-jre:compile
[INFO] \- com.moduleB:moduleB:jar:3.1:compile
[INFO] \- com.google.guava:guava:jar:31.0.1-jre:compile
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-enforcer-pluginartifactId>
<version>3.0.0version>
<executions>
<execution>
<id>enforceid>
<goals>
<goal>enforcegoal>
goals>
<configuration>
<rules>
<dependencyConvergence/>
rules>
configuration>
execution>
executions>
plugin>
plugins>
build>
冲突时输出
Dependency convergence error for com.google.guava:guava:31.0.1-jre paths to dependency are:
+-com.example:my-project:1.0.0
+-com.moduleA:moduleA:2.0
+-com.google.guava:guava:30.0-jre
and
+-com.example:my-project:1.0.0
+-com.moduleB:moduleB:3.1
+-com.google.guava:guava:31.0.1-jre
public class DependencyChecker {
public static void main(String[] args) {
System.out.println("Guava版本: " +
com.google.common.base.Strings.class.getPackage()
.getImplementationVersion());
}
}
<dependency>
<groupId>com.moduleBgroupId>
<artifactId>moduleBartifactId>
<version>3.1version>
<exclusions>
<exclusion>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
exclusion>
exclusions>
dependency>
<properties>
<guava.version>31.0.1-jreguava.version>
properties>
<dependencies>
<dependency>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
<version>${guava.version}version>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
<version>31.0.1-jreversion>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<configuration>
<argLine>-Dguava.version=31.0.1-jreargLine>
configuration>
plugin>
plugins>
build>
<dependencies>
<dependency>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
<version>31.0.1-jreversion>
dependency>
dependencies>
初始依赖配置
<dependencies>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-commonartifactId>
<version>3.3.1version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>2.6.3version>
dependency>
dependencies>
冲突分析
mvn dependency:tree -Dincludes=org.apache.logging.log4j
输出显示
+- org.apache.hadoop:hadoop-common:3.3.1
| \- org.apache.logging.log4j:log4j-slf4j-impl:2.14.1
\- org.springframework.boot:spring-boot-starter-web:2.6.3
\- org.springframework.boot:spring-boot-starter-logging:2.6.3
\- org.apache.logging.log4j:log4j-to-slf4j:2.17.1
解决方案
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-commonartifactId>
<version>3.3.1version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-slf4j-implartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-coreartifactId>
<version>2.17.1version>
dependency>
mvn versions:display-dependency-updates
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.6.3version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
project-root
├── pom.xml # 父POM管理公共配置
├── service-module # 业务模块
└── web-module # Web模块
冲突场景 | 解决方案 | 示例 |
---|---|---|
SLF4J多绑定 | 排除冲突实现 | 排除logback-classic保留log4j-slf4j |
Jackson版本差异 | 统一指定版本 | 强制使用2.13.1 |
Spring不同模块版本 | 使用BOM管理 | spring-boot-dependencies |
Servlet API冲突 | 设置provided scope | 使用Tomcat提供运行时依赖 |