開発プロセスでのMavenのjarパッケージの競合が比較的一般的であり、頭痛は、我々は問題より良いのjarパッケージの競合を解決するために、jarファイルパッケージの競合の原則を知っている必要があります。この記事原則のジャーパッケージの競合からとMavenのjarパッケージの競合で2詳しく説明ソリューションを解決します。
、Mavenは、JARパッケージでの紛争の原因
、Mavenプロジェクトの操作レポート次のエラーの場合:
引き起こさ:java.lang.NoSuchMethodErrorの
によって引き起こさ:java.lang.ClassNotFoundExceptionが
Mavenのjarファイルのパッケージの競合に起因するすべての可能性に。その後、ジャーパッケージの競合が発生する方法ですか?
まず、我々は推移に依存するJARパッケージを理解する必要があります。
図1に示すように、送信に依存し
、我々はA、Aに依存する必要がある場合、のpom.xmlジャーパッケージに導入される;のpom.xmlがMavenを解析するようにJARパッケージは、JARパッケージに依存A及びBに組み込むことができますとき、今度は、全てに組み込まれ、Bジャーパッケージとなります。
たとえば、次のように
ジャー春ブートアプリケーションでのインポートおよびネイティブHystrixグァバ:
<! -原生グアバAPI - >
<依存>
<groupIdを> com.google.guava </ groupIdを>
<たartifactId>グアバ</たartifactId>
<バージョン> 20.0 </バージョン>
</依存関係>
<! - (グアバへの依存度を含む)に依存hystrix - >
<依存>
<groupIdを> org.springframework.cloud </ groupIdを>
<たartifactId>スターター・春クラウドNetflixの-Hystrix </たartifactId>
<バージョン> 1.4.4.RELEASE </バージョン>
</依存関係>
jarファイルインポートしたプロジェクトの依存関係ツリーを取得したMavenのヘルパーウィジェットパッケージを使用しました:
図HystrixのJARパッケージからわかるようにグアバの依存参照含まれていますHystrix - >グアバ、その時間依存Hystrixの導入を、グアバも依存関係を紹介してきます。
2、紛争の原則へのjarパッケージ
のjarパッケージには、どのように競合が発生するのですか?
次の依存関係を仮定します。
A-> B-> C-> D1は(15.0ログ):C、Cの依存に含まれるBの依存に含まれるBはD1の依存に含まれ、D1は、JARパッケージ、バージョン15.0ログであると仮定されます
E-> F-> D2は(16.0ログ):E Fに応じて含まれる、D2への依存を含むFは、D2は同じログのjarパッケージ、バージョン16.0であると仮定されます
pom.xmlファイルA、2つの依存性Eを導入した場合、転送Mavenの依存性の原理によれば、D1、D2が導入され、D1、D2は同じD-依存異なるバージョンです。
法1()メソッド、D1は、(法1のDは、アップグレード後に増加させることができる)15.0である一方で、我々はあなたがJVM A、依存D1を読み込むときに、法1を見つけることができない、このメソッドを持っていない可能性があり、D2に呼び出しますこの方法は、NoSuchMethodErrorエラーが報告されます、この時間は、JARパッケージの競合を生産しました。
注意:
コール法2()メソッドの時に、D1、D2は、このメソッドが含まれている場合(複数のバージョンDがある場合でも、競合のバージョンの問題がないようにとD2のアップグレード版は、このメソッドは変更されません。)
例えば:
Mavenのヘルパープラグインの分析結果を使用してください:グアバは、この競合を依存関係。
我々はグアバネイティブのjarパッケージを導入する前に、バージョン番号は20.0であり、あなたはHystrixは、グアバのjarパッケージの異なるバージョンへの参照を含む推測できるようになりました、グアバの競合、およびHystrixが配置競合位置のjarパッケージを要求します。
私たちの推測を検証するために、Mavenのヘルパーを使用すると、プラグインHystrix依存jarファイルツリーをプリントアウトします:
私たちは見ることができます:中Hystrixジャーは、我々はのpom.xmlのバージョンで導入する前にグアバのjarパッケージには、ネイティブのグアバのjarパッケージながら、15.0で依存グアバは、2つのバージョンがありますように、20.0、15.0および20.0であるので、ジャーパッケージの競合が発生しました。
二、紛争へのMavenのjarパッケージソリューション
Mavenのpom.xmlファイルが解析され、同じパッケージには、唯一のjarパッケージの複数のバージョンの顔、その後、瓶を維持します、あなたはそれを解決する方法に必要ですか?
1、Mavenのデフォルトの戦略
最短パスファースト
D1およびD2は、JARパッケージ、即ちD2にデフォルト最短パスにより選択されるであろうMavenの顔。A-> B-> C-> D1ショートパスのE-> F-> D2の比。
最初の優先順位の文
パスが同じであれば、例えば:A-> B-> C1、E-> F-> C2、2つのパスの長さに依存して2は、最初の文を選択します。
2、依存関係を削除:依存に依存するJARパッケージの除外は、
(1)当社は、JARパッケージMavenのヘルパーは、紛争の依存性アナライザ分析にプラグインして、対応するJARパッケージにexecludeをクリックすることができます、上記の赤バージョンをマークし使用することができますジャーパッケージは除外します。
その後、リフレッシュの競合が消えます。
(2)手動除外
、または手動で使用<除外>ジャーを排除するのpom.xmlパケット衝突タグ(Mavenのヘルパーウィジェットexeclude上記の方法を使用して、メソッドに実際に等価です)。
<依存性>
<のgroupId> org.springframework.cloud </のgroupId>
<たartifactId>ばねクラウドスタータのNetflix-hystrix </たartifactId>
<バージョン> 1.4.4.RELEASE </バージョン>
<除外>
<除外>
< groupId> com.google.guava </ groupIdを>
<たartifactId>グアバ</たartifactId>
</除外>
</除外>
</依存関係>
MVN分析包冲突命令:
MVN依存性:ツリーの
3バージョン原則ロック:一般的に、親プロジェクト継承されたプロジェクトで使用される
通常のプロジェクトなど、この依存性のmoduleAとmoduleB共同依存Xなどのマルチモジュールプロジェクトは、その後、あなたはXを抽出し、そのバージョン番号を設定することができますされていますそれぞれmoduleAとmoduleBモジュールは、Xは、アップグレード、あまりにも多くの場所(moduleC、モジュール化...)に依存するが、実際の紛争のjarパッケージの原因、であるとき、アップグレードすることを忘れ参照Xを避けるために頼るアップグレードは必要ありませんXに依存しすぎより一般的な方法でプロジェクト開発。
まず、親のpom.xmlの定義は、宣言のpom.xmlに公衆に依存します:
<プロパティ>
<spring.version> spring4.2.4 </spring.version>
<プロパティ>
<dependencyManagement>
<依存性>
<依存性>
<のgroupId> org.springframework </のgroupId>
<たartifactId>春豆</たartifactId>
<バージョン> spring.versio $ {} </バージョン>
</依存>
</依存関係>
</ dependencyManagement>
親のpom.xml公開に直接依存参照ModuleAとmoduleB春豆ジャーパッケージは、定義することができる場合など:
その中のpom.xmlジャーを用いModuleAスプリング豆を(もはや定義バージョン):
<依存性>
<依存性>
<のgroupId> org.springframework </のgroupId>
<たartifactId>ばね豆</たartifactId>
</依存>
</依存関係>
moduleB在其のpom.xml使用スプリングビーン的瓶包如上类似。
<依存>
<依存>
<groupIdを> org.springframework </ groupIdを>
<たartifactId>春豆</たartifactId>
</依存関係>
</依存関係>
これらはもちろんの競合いくつかの小さなプログラム、実際に解決するために毎日開発Mavenのです開発問題のjarパッケージの競合がはるかに複雑これ以上であってもよいし、我々は特定の問題に対処する必要があります。
追加:Mavenのヘルパープラグインについての使用
Mavenのヘルパープラグインの設定
eラーニングでは、ほとんど情報を見つけたとき、MavenのヘルパーMavenのプラグインと話す準備中なので、私は誰もが共有するためのすべての私の研究のコンフィギュレーションを得ました!!IDEA(私はバージョン2017.2を使用)
IDEAの設定:オープンソフトウェア:ファイル - >設定 - >プラグイン
>プロジェクトのデフォルト - - >設定 - > [プラグインの設定:IDEAの中に開いていません
ダウンロードは、赤ポップアッププロンプトを失敗した場合、ロードに時間を言って、jarファイルをダウンロードダウンしていない、私はjarファイルを提供
リンクします。https://pan.baidu.com/s/1wz40Sbmxo-BT-kLCVUnezQ
パスワード:0lkq
私が追加、操作の下に、百度クラウドディスクJARファイルを共有するという考えでは、このJARファイル(MavenHelperプラグイン)
私はそれでこの数字に達した。この時間は、ソフトウェアの適用後に再起動されます、今回はのpom.xml Mavenプロジェクトを必要とします
メッセージを開始するかどうかをチェックし、赤Mavenのヘルパーを行った場合は、プログラムを再起動してください!ステップ4表示されるまで!Mavenのヘルパーを使用することができます依存関係アナライザ後3つの表示オプションがありますが、(例えば、タブのよりになる次のファイル、ファイルの後にオープン)の依存関係アナライザはポンポンファイルを閲覧開くそれぞれの依存関係分析ビューを、入力することで、テキスト依存XMLを追加することができますコンフリクト(競合)で、リストなどのすべての依存関係(リストビューすべての依存)、すべての依存関係ツリーとして(ツリービューすべての依存)。そして、これはまた、検索ページをサポートしています。非常に便利!そして、プラグインを使用すると、すぐにMavenのコマンドを実行することができます。図は次のとおりです。
バージョンは互換性のプラグインやアイデア、うまく他のプラグインのバージョンではないため、発生する可能性があり、次のエラーのインストール中。
ソースを記入してください。https://blog.csdn.net/qq_33541575/article/details/80211122