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>