Mavenプロジェクトでのjarパッケージの競合の解決策

1つは、Mavenでのjarパッケージの競合エラー

MAVENプロジェクトの操作中に以下のエラーが報告された場合:

原因:java.lang.NoSuchMethodError
原因:java.lang.ClassNotFoundException

9つのうち8つは、Maven jarパッケージの競合が原因です。

第二に、mavenのjar競合原理

mavenのjarパッケージには依存関係があります。
次の依存関係を想定します。

A-> B-> C-> D1(ログ15.0):AにはBへの依存関係が含まれ、BにはCへの依存関係が含まれ、CにはD1への依存関係が含まれます(D1がログjarパッケージであり、バージョンが15.0である場合)
E-> F-> D2(ログ16.0):EにはFへの依存関係が含まれ、FにはD2への依存関係が含まれます(D2が同じログjarパッケージであると仮定すると、バージョンは16.0です)

2つの依存関係AおよびEがpom.xmlファイルに導入されると、Mavenの依存関係を渡す原理に従って、D1およびD2が導入され、D1およびD2は同じ依存関係Dの異なるバージョンです。
D2でmethod1()メソッドを呼び出し、D1がバージョン15.0(method1はDのアップグレード後に追加されたメソッドである場合があります)の場合、このメソッドがない可能性があるため、JVMがAのD1依存関係をロードすると、method1が見つかりません。メソッド、それはNoSuchMethodErrorエラーを報告します、今回はjarパッケージの競合があります。
注:
method2()メソッドが呼び出されると、D1とD2の両方にこのメソッドが含まれます(また、アップグレードされたバージョンD2はこのメソッドを変更しないため、Dに複数のバージョンがある場合でも、バージョンの競合は発生しません。)

3、Mavenでのjarパッケージの競合解決

MVN分析パッケージの競合コマンド:

mvn dependency:tree

Mavenがpom.xmlファイルを解析するとき、保持されるjarパッケージは1つだけなので、複数のバージョンのjarパッケージの問題をどのように解決しますか?

1. Mavenのデフォルトの処理戦略

  • 最初に最短経路

MavenがD1およびD2に直面すると、デフォルトで最短のパス、つまりD2のjarパッケージが選択されます。E-> F-> D2は、A-> B-> C-> D1よりも1短い。

  • 最初に宣言

パスが同じ場合(A-> B-> C1、E-> F-> C2など)、2つの従属パスの長さは2であり、最初に宣言することを選択します。

2.依存関係の削除:依存するjarパッケージを除外するために使用されます

pom.xmlでタグを使用して、jarパッケージの競合を排除します

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        <version>1.4.4.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclusion>
    </exclusions>
</dependency>

3.バージョンロックの原則:通常、継承されたプロジェクトの親プロジェクトで使用されます。

通常のプロジェクトはマルチモジュールプロジェクトです。moduleAとmoduleBが依存関係としてXに依存している場合、Xの抽出とそのバージョン番号の設定を同時に行うことができるため、Xがアップグレードに依存している場合、moduleAとmoduleBを分離する必要はありません。アップグレードするXに依存し、多くの場所(moduleC、moduleD ...)がアップグレードを忘れ、Xの依存関係を参照するときにjarパッケージの競合を引き起こすことを回避します。これは、実際のプロジェクト開発における一般的な方法でもあります。

最初に親pom.xmlを定義し、pom.xmlにpublic依存関係を配置して宣言します。

<properties>
    <spring.version>spring4.2.4</spring.version>
<properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.versio}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

このようにして、たとえば、moduleAとmoduleBがSpring-beans jarパッケージを参照する場合、それらは親pom.xmlで定義されたパブリック依存関係を直接使用できます
。moduleAはpom.xmlでspring-bean jarパッケージを使用します(バージョンを定義する必要はありません)。

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
    </dependency>
</dependencies>
元の記事を9件公開 賞賛0件 訪問62件

おすすめ

転載: blog.csdn.net/yangbllove/article/details/105569492