假设我有四个项目:
在这个场景中,如果我运行项目A,Maven将正确地将依赖项解析为D。如果我正确理解了这一点,Maven总是采用路径最短的依赖项。由于D是A的直接依赖项,因此将使用它,而不是B中指定的D。
但现在假设这个结构:
在这种情况下,解析D的路径具有相同的深度。发生的情况是Maven会有一个冲突。我知道可以告诉Maven他应该排除依赖项。但我的问题是如何解决这类问题。我的意思是,在现实世界的应用程序中,你有很多依赖项,也可能有很多冲突。
最佳实践解决方案真的是排除东西吗?或者有其他可能的解决方案吗?当我突然得到一个ClassNotFound异常时,我发现很难处理,因为一些版本已经改变了,这导致了Maven采用不同的依赖。当然,知道这一事实会让我们更容易猜测问题是依赖冲突。
我使用maven 2.1-SNAPSHOT。
发布于 2011-08-24 21:19:19
解决这种情况的maven方法是在项目的根pom中包含一个<dependencyManagement>
部分,您可以在其中指定将使用哪个库的版本。
编辑:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</dependencyManagement>
现在,无论依赖项请求的是foo:bar库的哪个版本,1.2.3版都将始终用于此项目和所有子项目。
参考:
发布于 2011-08-24 21:19:58
Maven可以处理这两种情况,而不会发生任何冲突。当需要传递依赖的两个版本时,将存在冲突。您描述的ClassNotFoundException
来自应用程序(或依赖项)尝试使用在实际使用的冲突依赖项版本中不可用的类。有多种方法可以解决这个问题。
<dependencyManagement>
部分明确排除不需要的冲突依赖项版本,使其不会包含在依赖于它们的依赖项中发布于 2011-08-24 20:40:57
这基本上不是maven问题,而是java问题。如果项目B和项目C需要两个不兼容的项目D版本,则不能在项目A中同时使用这两个版本。
不幸的是,正如您已经知道的,解决此类冲突的Maven方法是选择排除哪些冲突。
使用mvn dependency:analyze
和mvn dependency:tree
有助于发现您所遇到的冲突。
https://stackoverflow.com/questions/7175398
复制相似问题