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

时间:2017-04-03 01:49:04

标签: java maven classpath transitive-dependency

最近接触 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-core

中使用maven-embedder

3 个答案:

答案 0 :(得分:1)

您要从该特定依赖项中排除该工件,但它可能会从另一个依赖项中获取。使用mvn dependency:tree -Dverbose -Dincludes=maven-core之类的东西应该会向您展示引入依赖项的其他内容。 The Maven Enforcer plugin can also help exclude transitive dependencies

答案 1 :(得分:1)

有不同的可能性:

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

答案 2 :(得分:0)

错误不会在编译时抛出,如果使用任何功能,它将在运行时抛出依赖于maven-core