如何解决Maven中的依赖冲突?

时间:2016-06-02 14:36:26

标签: java maven

我有一个相当大的遗留项目,我正在添加一个组件。该组件使用HtmlUnit。我可以用Maven编译它,但是当我运行它时我得到:

java.lang.NoSuchMethodError:
  org.apache.http.conn.ssl.SSLConnectionSocketFactory.<init>
    (Ljavax/net/ssl/SSLContext;[Ljava/lang/String;[Ljava/lang/String;Ljavax/net/ssl/HostnameVerifier;)

所以它错过了正确的构造函数。我认为这几乎肯定是httpclient中的版本冲突,但我不确定如何解决它。这是我pom.xml的相关部分(请注意我尝试使用排除和依赖管理的所有游戏):

<dependencies>
        <dependency>
            <groupId>com.mycompany.mine</groupId>
            <artifactId>my-base-project</artifactId>
            <version>${project.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.httpcomponents</groupId>
                    <artifactId>httpclient</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.mycompany</groupId>
            <artifactId>base-project</artifactId>
            <version>${project.version}</version>
            <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.httpcomponents</groupId>
                    <artifactId>httpclient</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.2</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.2</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

有什么想法吗?

修改:有人建议此问题与this one重复,但由于此情况下的依赖关系类型不是{{} 1}}。

1 个答案:

答案 0 :(得分:2)

要识别冲突的家属,请使用background-image: url("../images/ico-add.png"); 。我喜欢将它管道传输到文本文件以便于使用:

mvn dependency:tree

然后,使用您喜欢的文本编辑器查找依赖项的多个版本。

或者,如果您要查找特定的groupId或artifactId,请使用mvn dependency:tree > tree.txt 标记:

-Dincludes

您可能还想在此处添加mvn dependency:tree -Dincludes=<groupId>:<artifactId>:<version>:<packaging> mvn dependency:tree -Dincludes=org.springframework <<< get all dependencies with by groupId mvn dependency:tree -Dincludes=:spring-web <<< get all dependencies by artifactId 标记。

要解决依赖冲突,有两种方法:

1)排除你不想要的那个

-Dverbose

通过这种方式,您将不得不排除引入传递的依赖项。因此我更喜欢另一个。

2)明确添加您想要的版本

<depdency>
    <groupId>some.stuff</groupId>
    <artifactId>with.transitive.depdency</artifactId>
    <exclusions>
        <exclusion>
            <groupId>something</groupId>
            <artifactId>unwanted</artifactId>
        <exclusion>
    <exclusions>
<depdency>

这将确保任何传递依赖项将与此确切版本交换。如果某个框架实际上需要旧版本,这也可能导致错误。为了安全地使用此策略,您的依赖项需要非常接近最新的可用版本(或同时发布的版本)。