簡體   English   中英

如何解決Maven中的依賴沖突?

[英]How do I resolve a dependency conflict in 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>

有任何想法嗎?

編輯 :它已經表明,這個問題是一個重復的這一個 ,但它不是,因為在這種情況下,依賴類型不是war

為了識別沖突的依賴關系,請使用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

您可能還想在此處添加-Dverbose標志。

要解決依賴關系沖突,有兩種方法:

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>

這將確保任何傳遞依賴項都將與此確切版本交換。 如果某些框架實際上需要較舊的版本,則這也可能導致錯誤。 為了安全地使用此策略,您的依賴項必須與最新的可用版本(或同時發布的版本)相當接近。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM