0

我正在使用enforcerMaven 的插件,我看到一种我不太理解的行为,而且很危险。

假设我有一个冲突,因为依赖已经A并且bla.jar:1.0与我的依赖冲突Bbla.jar:2.0

然后为了解决冲突,我排除了bla.jar:1.0fromA

  <dependency>
      <groupId>com.foo</groupId>
      <artifactId>A</artifactId>
      <version>a.version.bla</version>
      <exclusions>
        <exclusion>
          <groupId>com.omg</groupId>
          <artifactId>bla</artifactId>
        </exclusion>
      </exclusions>
   </dependency>

期望应用程序将获得前bla.jar:2.0类路径。但是后来我看到当我运行一些单元测试时,java proce3ss 根本找不到bla.jar类路径,并且在运行时给了我ClassNotFound

知道这里有什么问题吗?

我在我的 pom 中定义了从上到下 B 然后是 A

4

1 回答 1

2

请注意,排除不是解决依赖版本冲突的最佳方法。

最好的方法是使用<dependencyManagement>. 它允许您设置一个版本来替换该依赖项的所有传递版本。

在您的情况下,我首先将排除项更改为<dependencyManagement>. 然后我将按照以下方式进行:

  1. 检查mvn dependency:list哪个版本的依赖项在类路径上。它应该是 中指定的,<dependencyManagement>除非在您的依赖关系树中没有该依赖项的版本。如果你发现不止一个,那么 groupId 可能在某个时候发生了变化。然后你需要排除。

  2. 检查依赖的范围并验证它确实是compile.

  3. 然后打开依赖jar,看看这个jar是否真的包含你得到的类ClassNotFound。通常类会随着版本的变化而变化。

于 2020-05-25T08:40:42.907 回答