为什么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-core
在maven-embedder
地方使用)
答
有不同的可能性:
- 正如卡尔说:检查
dependency:tree
如果依赖是不是从别的地方拉入。 - 即使
maven-embedder
确实使用它,也可能完全不使用maven-core
:假设例如maven-embedder
有两个A和B类。您只使用A,但maven-core
仅由B使用。然后(如果A和B彼此不使用),您的项目可能完全独立于maven-core
。 (一方面的评论:有些罐子在逻辑上应该是两个独立的罐子,但是无论什么原因合并在一起 - 在我们的例子中,应该考虑将A和B放入单独的工件中)。 - 传递依赖在编译时是不必要的,但在运行时使用。
答
的错误不会在编译的时候抛出,它会在运行时抛出,如果你使用任何功能依赖于Maven的核心
答
您排除从该神器特定的依赖关系,但它可能会从另一个依赖关系中被引入。使用mvn dependency:tree -Dverbose -Dincludes=maven-core
应该告诉你还有什么介绍依赖。 The Maven Enforcer plugin can also help exclude transitive dependencies。
这绝对是可能的,JF梅勒的答案涵盖了更多的可能性。 – javarookie