冲突的依赖关系:如何选择?

时间:2012-01-18 15:49:35

标签: java maven

让我们以项目A为例,其中包含依赖项(包括传递依赖项)。如果我查看依赖树,我看到最后在一条路径上,我有slf4j-api:1.6.4并且在另一条路径的末尾,我有slf4j:1.6.1。

我必须选择哪种依赖?如果我选择slf4j:1.6.4,我的类路径上没有版本1.6.1,我怎么知道版本1.6.4是否与使用版本1.6.1的代码兼容?

我不明白,因为最后我的类路径上只有一个slf4j版本。

由于

1 个答案:

答案 0 :(得分:2)

Maven旨在管理这些传递依赖项,并确保类路径中只存在一个版本的jar。

如何查看Maven正在做什么

dependency插件将演示Maven代表你做什么(通过各种POM拖曳并确定还有谁宣布对相同模块的依赖)。

[INFO] [dependency:tree]
[INFO] org.apache.maven.plugins:maven-dependency-plugin:maven-plugin:2.0-alpha-5-SNAPSHOT
[INFO] +- org.apache.maven.reporting:maven-reporting-impl:jar:2.0.4:compile
[INFO] |  \- commons-validator:commons-validator:jar:1.2.0:compile
[INFO] |     \- commons-digester:commons-digester:jar:1.6:compile
[INFO] |        \- (commons-collections:commons-collections:jar:2.1:compile - omitted for conflict with 2.0)
[INFO] \- org.apache.maven.doxia:doxia-site-renderer:jar:1.0-alpha-8:compile
[INFO]    \- org.codehaus.plexus:plexus-velocity:jar:1.1.3:compile
[INFO]       \- commons-collections:commons-collections:jar:2.0:compile

通常选择最新版本的模块,这是有道理的,因为某些模块可能正在使用仅在最新版本的日志库中提供的方法。实际上,当依赖代码没有保持锁定步骤时,通常会删除导致编译问题的已弃用方法...

如何告诉Maven该做什么

如果您想要更多地控制所选版本,则需要指定依赖版本范围,如下所示:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>[3.8,4.0)</version>
    <scope>test</scope>
</dependency> 

此处描述了功能性:

希望这有帮助。