maven依赖准则
- 间接依赖最短优先: a>b>c和a>e>f>d>c, 则优先应用前者
- 申明程序优先: 若门路长度雷同, 则先申明优先.
抵触起因
maven有传递依赖机制, 当A依赖B, 引入A依赖时, 则mave在解析A时连同B一起引入.- A>B>C>G21(guava 20.0)
- E>F>G20(guava 21.0)
假如pom引入A和E, 则maven会引入guava 20.0而不是G21, 当程序中调用G21新加的办法或类时, 会跑出ClassNotFoundException/NoSuchMethodError
排查
- 通过类/办法查找, 如能够找到则存在jar包抵触, 找不到则可能是短少jar包, 引入即可.
- 应用mvn dependency:tree [-Dverbose -Dincludes=groupId:artifactId], 或DIEA插件Maven Helper查看依赖树
- 查看查找类中版本和maven依赖中的版本是否雷同
- 示例
报错: Caused by: java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable
查找类, 存在, 则jar包抵触, 援用的spring-core 4.2.2
查看依赖树, 引入的是spring-core3.0.7, 与类版本不统一
找到抵触pom, 增加排除