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

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

问题描述:

新暴露Maven的,我能理解<exclusion>标签的使用情况,但不知道为什么它不会造成编译错误:为什么Maven依赖排除不会导致编译错误?

<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地方使用)

有不同的可能性:

  1. 正如卡尔说:检查dependency:tree如果依赖是不是从别的地方拉入。
  2. 即使maven-embedder确实使用它,也可能完全不使用maven-core:假设例如maven-embedder有两个A和B类。您只使用A,但maven-core仅由B使用。然后(如果A和B彼此不使用),您的项目可能完全独立于maven-core。 (一方面的评论:有些罐子在逻辑上应该是两个独立的罐子,但是无论什么原因合并在一起 - 在我们的例子中,应该考虑将A和B放入单独的工件中)。
  3. 传递依赖在编译时是不必要的,但在运行时使用。

的错误不会在编译的时候抛出,它会在运行时抛出,如果你使用任何功能依赖于Maven的核心

您排除从该神器特定的依赖关系,但它可能会从另一个依赖关系中被引入。使用mvn dependency:tree -Dverbose -Dincludes=maven-core应该告诉你还有什么介绍依赖。 The Maven Enforcer plugin can also help exclude transitive dependencies

+0

这绝对是可能的,JF梅勒的答案涵盖了更多的可能性。 – javarookie