2012-11-29 74 views
2

我有一个依赖如下:当我部署行家依赖拉动了错误的依赖

<dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>4.2</version> 
     <scope>compile</scope> 
    </dependency> 

这是拉低另一个依赖httpcore.4.1.4它抛出一个ClassDefNotFound,httpcore.4.2一切正常。

我加入这两个之间的依赖关系如下:

<dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>4.2</version> 
     <scope>compile</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpcore</artifactId> 
     <version>4.2</version> 
     <scope>compile</scope> 
    </dependency> 

,仍然面临着同样的问题,即:MVN带来下来httpcore.4.1.2httpcore.4.2

我怎样才能解决这个问题?

编辑:

增加;

​​
+0

'$ mvn dependency:tree -Dverbose -Dincludes = httpcore',它将在依赖关系树中显示所有版本的'httpcore',包括那些省略的。它会告诉你在哪里/为什么得到版本“4.1.4” – Hong

回答

4

您可能有传递性依赖关系,其他依赖性依赖于您不想要的版本。

要获得所有依赖的概述,直接和传递,尝试:

MVN依赖性:树

如果你发现不同版本的相同的依赖性,第一件事情之间的碰撞你应该做的是找出崩溃是否至关重要(你是否需要两者?)如果不是,升级,以使最低的依赖版本将等于最高。如果它是传递依赖项,则考虑升级此版本。

如果您只是想锁定到依赖的特定版本,你有一些选择:

排除传递依赖:

<dependency> 
    <groupId>com.something</groupId> 
    <artifactId>something</artifactId> 
    <exclusions> 
    <exclusion> 
     <groupId>com.somethingElse</groupId> 
     <artifactId>somethingElse</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 

包括特定版本:

<dependency> 
    <groupId>com.somethingElse</groupId> 
    <artifactId>somethingElse</artifactId> 
    <version>2.0</version> 
</dependency> 

在您的pom中显式添加的任何依赖项版本将覆盖同一groupId/artifactId的任何传递依赖项的版本。

尽管有点谜题,但您应该尝试获取兼容版本的依赖关系,即具有相同版本传递依赖关系的版本。

+0

我看到有冲突。我如何重写版本以获得最新的版本或可以并排? – DarthVader

+0

根据我的经验,将它们并排放在一起并不会很好,因为它常常会导致错误的调用。但是哪个依赖取决于你不想要的版本? – Tobb

+0

我想要httpcore.4.2而不是httpcore.4.1。*。我添加了dependencyManagement标签。这将工作吗?请参阅我的编辑。 – DarthVader