当前位置: 首页 > 知识库问答 >
问题:

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

孟翰海
2023-03-14

我有一个相当大的遗留项目,我正在添加一个组件。此组件使用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>

有什么想法吗?

编辑:有人认为这个问题是这个问题的重复,但事实并非如此,因为本例中的依赖类型不是war

共有1个答案

赫连昕
2023-03-14

要识别冲突的依赖项,请使用mvn dependency:tree。我喜欢通过管道将其传输到文本文件以便于使用:

mvn dependency:tree > tree.txt

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

或者,如果您正在查找特定的groupId或artifactId,请使用-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

您可能还想在这里添加-Danyose标志。

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

1) 排除你不想要的那个

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

通过这种方式,您必须排除每个引入可传递依赖项的依赖项。因为这个原因,我更喜欢另一个。

2) 显式添加所需的版本

<dependency>
    <groupId>something</groupId>
    <artifactId>with.version.conflict</artifactId>
    <version>what I want</version>
</dependency>

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

 类似资料:
  • 我正在尝试解决我的eclipse项目中的maven依赖项。 依赖项已经下载到我的maven dependencies文件夹中(如下所示) 然而,import语句仍然没有解析。 在我的java构建路径中,存在Maven Dependencies文件夹。 到目前为止,我已经尝试在命令行上重建项目并在eclipse中刷新它;我尝试在eclipse中重建它;我尝试在eclipse中更新项目。 似乎什么都没

  • 由一些模块组成的maven项目。我的一个模块正在使用google版本的guava依赖项。现在,我正在我的项目中集成另一个模块,该模块也使用guava但版本。 因此,我希望新模块使用guava版本,而其余项目使用guava版本。我尝试将guava的添加到新模块中,但没有成功。 更新:@Guillaume Darmont的答案为不同的模块解决了问题。但现在我的问题是,新模块有两个依赖项,其中一个使用g

  • 我正在开发一个Android库。该库几乎没有依赖关系。我不确定如果开发人员将我的库与我的库中已经存在的其他依赖项一起使用会发生什么。我试着搜索这个,但什么也找不到。 例如,我在我的库中使用version X的Volley库,并将其作为gradle包发送。开发人员将Version Y和我的库一起导入Volley。 在库(模块、jar或包)中包含依赖项的最佳方式是什么,以最大限度地减少冲突情况。

  • maven jetty插件有这个错误。我认为出现这个问题是因为插件的传输依赖性与新库冲突。这个错误出现在我将jersey1更改为jersey2并从com更改所有依赖项之后。sun到org。glassfish用于服务器客户端/核心/rs ws等。 等等 有人能回答如何避免这种错误吗?谢谢。 更新1:http://pastebin.com/ag2zdiSH链接到完整的pom

  • 我们有一个项目a依赖于项目B,项目B依赖于图书馆C。a和B是本地项目,而C是maven central repo的公共图书馆。 波姆。xml用于: 波姆。用于B的xml: 在A中运行mvn dependency:tree-Dverbose时,它不会解析B的依赖项,B中使用的此类依赖项也不会显示在A的Maven依赖项中。这对于编译很好,但在运行时会因为NoClassDefFound错误而失败。 有没