首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Maven依赖项解析(冲突)

Maven依赖项解析(冲突)
EN

Stack Overflow用户
提问于 2011-08-24 20:27:57
回答 5查看 64.3K关注 0票数 82

假设我有四个项目:

  • 项目A(依赖于B和D)
  • 项目B(依赖于D)
  • 项目C(依赖于D)
  • 项目D

在这个场景中,如果我运行项目A,Maven将正确地将依赖项解析为D。如果我正确理解了这一点,Maven总是采用路径最短的依赖项。由于D是A的直接依赖项,因此将使用它,而不是B中指定的D。

但现在假设这个结构:

  • 项目A(依赖于B和C)
  • 项目B(依赖于D)
  • 项目C(依赖于D)
  • 项目D

在这种情况下,解析D的路径具有相同的深度。发生的情况是Maven会有一个冲突。我知道可以告诉Maven他应该排除依赖项。但我的问题是如何解决这类问题。我的意思是,在现实世界的应用程序中,你有很多依赖项,也可能有很多冲突。

最佳实践解决方案真的是排除东西吗?或者有其他可能的解决方案吗?当我突然得到一个ClassNotFound异常时,我发现很难处理,因为一些版本已经改变了,这导致了Maven采用不同的依赖。当然,知道这一事实会让我们更容易猜测问题是依赖冲突。

我使用maven 2.1-SNAPSHOT。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-24 21:19:19

解决这种情况的maven方法是在项目的根pom中包含一个<dependencyManagement>部分,您可以在其中指定将使用哪个库的版本。

编辑:

代码语言:javascript
复制
<dependencyManagement>
  <dependencies>
    <dependency>
        <groupId>foo</groupId>
        <artifactId>bar</artifactId>
        <version>1.2.3</version>
    </dependency>
   </dependencies>
</dependencyManagement>

现在,无论依赖项请求的是foo:bar库的哪个版本,1.2.3版都将始终用于此项目和所有子项目。

参考:

票数 94
EN

Stack Overflow用户

发布于 2011-08-24 21:19:58

Maven可以处理这两种情况,而不会发生任何冲突。当需要传递依赖的两个版本时,将存在冲突。您描述的ClassNotFoundException来自应用程序(或依赖项)尝试使用在实际使用的冲突依赖项版本中不可用的类。有多种方法可以解决这个问题。

  1. 更新您正在使用的依赖于冲突依赖项的库的版本,以便它们都依赖于该库的相同版本冲突依赖项作为项目与您要包含的版本的直接依赖项(在本例中,包含缺少类的版本)
  2. 指定传递依赖项应使用的冲突依赖项的版本,通过POM
  3. <dependencyManagement>部分明确排除不需要的冲突依赖项版本,使其不会包含在依赖于它们的依赖项中
票数 31
EN

Stack Overflow用户

发布于 2011-08-24 20:40:57

这基本上不是maven问题,而是java问题。如果项目B和项目C需要两个不兼容的项目D版本,则不能在项目A中同时使用这两个版本。

不幸的是,正如您已经知道的,解决此类冲突的Maven方法是选择排除哪些冲突。

使用mvn dependency:analyzemvn dependency:tree有助于发现您所遇到的冲突。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7175398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档