jar包冲突解决

  1. maven依赖原则

    1. 间接依赖最短优先: a>b>c和a>e>f>d>c, 则优先使用前者
    2. 声明顺序优先: 若路径长度相同, 则先声明优先.
  2. 冲突原因
    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

  3. 排查

    1. 通过类/方法查找, 如可以找到则存在jar包冲突, 找不到则可能是缺少jar包, 引入即可.
    2. 使用mvn dependency:tree [-Dverbose -Dincludes=groupId:artifactId], 或DIEA插件Maven Helper查看依赖树
    3. 查看查找类中版本和maven依赖中的版本是否相同
  4. 示例
    报错: Caused by: java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable
    查找类, 存在, 则jar包冲突, 引用的spring-core 4.2.2
    jar包冲突解决_第1张图片

查看依赖树, 引入的是spring-core3.0.7, 与类版本不一致
jar包冲突解决_第2张图片

找到冲突pom, 添加排除
jar包冲突解决_第3张图片

你可能感兴趣的:(maven)