当前位置: 首页 > 面试题库 >

Maven依赖关系解析(冲突)

阴礼骞
2023-03-14
问题内容

假设我有四个项目:

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

在这种情况下,如果我运行项目A,则Maven将正确地解决对D的依赖关系。如果我理解正确,则Maven始终以最短的路径获取依赖关系。由于D是A的直接依赖项,因此将使用B内指定的D而不是D。

但是现在假设这种结构:

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

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

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

我正在使用Maven 2.1-SNAPSHOT。


问题答案:

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

编辑:

<dependencyManagement>
  <dependencies>
    <dependency>
        <groupId>foo</groupId>
        <artifactId>bar</artifactId>
        <version>1.2.3</version>
    </dependency>
   </dependencies>
</dependencyManagement>

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

参考:

  • 依赖管理


 类似资料:
  • 我已经在pom中配置了本地maven存储库。xml。当我构建项目时,它会显示依赖项下载错误(请参阅下面的日志)。Maven正在尝试从我的本地Maven存储库下载所有依赖项。 日志 这是我的pom。xml文件 本地存储库是http://XXX。XXX。XX。XXX:8081/artifactory/libs本地发布 xml。背景

  • 在下面的示例中,OSGi解析和Maven依赖支持中所需的步骤似乎存在差异/重复。 我有一个jar,它依赖于外部第三方jar,在本例中时间为4J。 然后,我可以通过导入包并运行等方式在本地运行我的简单jar。 当导入OSGi时,我必须确保首先导入这个jar,通常使用PAX包装URL。 这对于一个jar依赖关系是可以的,但是当有多个依赖关系时又如何。我可以使用features.xml文件来收集这些JA

  • 问题内容: 我正在运行一个依赖groovy 1.7-beta-1的项目。gmaven插件使用groovy 1.6版作为依赖项。在pom中,我在依赖性管理部分中将grooyv-all版本指定为: 但是,当我在调试模式下运行maven时,我看到groovy 1.6被用于对gmaven插件的依赖。我以为我的依赖项管理部分会重写此设置,因此它们都使用1.7-beta-1,但是由于常规版本不同,我遇到了错误

  • 问题内容: 我有一个依赖关系如下: 当我部署一切正常时,这将拉下另一个引发ClassDefNotFound的依赖项。 我添加了两个依赖项,如下所示: 并且仍然面临着同样的问题,即:MVN带来下来不 我该如何解决? 编辑: 添加; 问题答案: 您可能有一个传递依赖项,另一个依赖项取决于您不需要的版本。 要获得所有直接和传递依赖关系的概述,请尝试: mvn依赖项:树 如果您发现同一依赖项的不同版本之间

  • 我在同一个IntelliJ项目中加载了两个Maven模块。一个模块依赖于另一个模块。如果我更改了它的版本,那么我的第二个模块将无法再解析依赖关系,除非我首先显式运行<code>mvn安装 当模块加载到同一项目中时,IntelliJ不能从源模块中解析Maven依赖关系吗?

  • 问题内容: 我最近升级了一个项目以使用hibernate3.6.10.Final。该项目使用常春藤检索和依赖项。现在,我收到一个错误,即找不到slf4j中的方法。我相信这是由于hibernate- core(要求1.6.1)和hibernate-commons- annotations(要求1.5.8)之间的slf4j依赖项冲突造成的。根据hibernate-core ivy.xml,hibern