为什么 Maven 依赖排除不会导致编译错误?

Why Maven dependency exclusion would not cause compile error?

刚接触Maven,可以理解<exclusion>标签的用例,但不知道为什么不会导致编译错误:

<dependencies>
<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-embedder</artifactId>
  <version>2.0</version>
  <exclusions>
    <exclusion>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>
...

这是否只有当您对 maven-core 有另一个直接依赖时才有可能?否则,应该会发生编译错误。 (假设 maven-coremaven-embedder 某处使用)

错误不会在编译时抛出,如果你使用依赖maven-core的任何特性,它会在运行时抛出

您正在从该特定依赖项中排除该工件,但它可能会从另一个依赖项中提取出来。使用 something mvn dependency:tree -Dverbose -Dincludes=maven-core 应该会告诉你还有什么引入了依赖性。 The Maven Enforcer plugin can also help exclude transitive dependencies.

有不同的可能性:

  1. 正如 Carl 所说:检查您的 dependency:tree 是否没有从其他地方引入依赖项。
  2. 有可能根本没有使用 maven-core,即使 maven-embedder 确实使用了它:假设例如maven-embedder 有两个 类 A 和 B。你只使用 A,但 maven-core 只被 B 使用。然后(如果 A 和 B 不互相使用),你的项目可能完全独立于 maven-core。 (附带说明:一些罐子在逻辑上应该是两个独立的罐子,但无论出于何种原因合并在一起 - 在我们的示例中,应该考虑将 A 和 B 放在单独的工件中)。
  3. 传递依赖项可能在编译时不是必需的,但在运行时会用到。