2015-12-10 5 views
7

「最も近い」よりも競合に「最新の」依存関係を選択するようにMavenを設定できますか?Mavenは、最も近いものではなく最新のものに依存性メディエーション戦略を設定しました

「最新」はアイビーや他の賢明な依存関係の管理職ではデフォルトで、私は「最も近い」戦略は、私が欲しいものはめったにありません見つけるhttp://ant.apache.org/ivy/history/2.2.0/settings/conflict-managers.html

を参照してください。

私はMaven 3.3.3を使用していますが、必要に応じてバージョンを切り替えることができます。

個々の競合でMavenの選択を上書きする方法はわかっていますが、一度に1つずつ競合を検出して修正する必要がないようにデフォルトを変更したいと考えています。

(「依存関係の調停」でthe Maven docsを参照してください)

+1

あなたがほっとしたくないと言うなら、意見は1つだけです。私が知る限り、この動作を変更する簡単な方法はありません...あなたができることは、Maven Coreの動作を変更するパッチを提供することです。そのような事柄を検出するには、そのような状況を識別するためにエンフォーサルールを使用できます。 .. – khmarbaise

+2

この機能をMavenに追加しようとした以前の試みで[このディスカッション](http://maven.40175.n5.nabble.com/Adding-support-for-new-dependency-mediation-strategy-td5768185.html)読む価値がある – heenenee

+3

ありがとう、@heenenee。ここ10年間でMavenがまったく進化しなかった理由が分かります。それは完全に瀕死のようです。たぶん私は私のプロジェクトをSBTに切り替えるつもりです.SBTは、最新の依存関係の競合を解決し、Maven depsを消費し、IntelliJによってサポートされています。 – Rich

答えて

2

私は、バージョンの競合を解決するときに、自動的に代わりに「最も近い」の依存関係の「最新」バージョンを使用するようにMavenを設定することはできますか?

、あなたは最寄り以外にMavenの依存関係の調停戦略を設定することはできません。

configurable dependency mediation strategies has been proposed beforeを追加しましたが、この提案では、何年も起こっていないPOM XSDの変更が含まれていたため、最終的に放棄されました。

なぜ、Mavenは最も近い戦略をデフォルトとして使用しますか?

最寄りの戦略は二つの理由にMavenによって支持されています。個々の紛争の

  1. 簡単オーバーライド:特定の競合 の依存関係のために、あなたがあなた自身のPOMの中にそのバージョンを指定することができ、そのバージョンが最も近いものになります。
  2. 再現性はを構築します。これは本当にあなたの依存関係グラフ内のどこにでもversion rangesを持っていることの結果が、「最新の」確かにビルド再現性のいずれかのバージョンの範囲の影響を拡大しまうの調停戦略だろう。

しかし、私は本当に別の依存メディエーション戦略が欲しいです。私に何ができる?

これらはあなたの最高のオプションです:

  1. は、Mavenの拡張を作る: "最も近い" 戦略の使用法は、NearestVersionSelector in MavenRepositorySystemUtilsによって指定されます。独自のVersionSelectorを定義するcreate your own Maven extensionを選択してください。afterSessionStart拡張メソッドのメソッドでは、DependencyGraphTransformerというセッションをカスタムVersionSelectorを使用するものに置き換えてください。
  2. 別のビルドツールに移行:明らかです。
+0

ありがとうございます。ビルドプラグインはこの動作をオーバーライドできませんか?これはPOM XSDを変更することなくこれを変更する道を与えます。 – Rich

+0

このコメントは、ビルドプラグインが依存関係を変更できないことを示唆しています: "Maven 3.xは、このプラグインが最適に機能することを不可能にする依存性解決の変更を導入しました。 Mavenがプロジェクトの依存関係を解決する前にプラグインが外部依存関係をダウンロードしてインストールすることは不可能です。 https://github.com/UniversalMediaServer/external-maven-plugin#external-dependency-maven-plugin – Rich

+0

このクラスは何ですか? https://github.com/apache/maven/blob/master/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/NewestConflictResolver.java – Rich

1

また、直接「最新勝ち」競合解決ポリシーを実装しませんが、最終結果は同じであることを強制されますMavenの「執行者」のプラグインのための"requireUpperBoundDeps"ルールを使用することができます。推移従属<exclusions>または<dependencyManagement>のルールをPOMに手動で追加して、各競合の中で最新の依存関係を選択する必要がありますが、少なくとも最終結果が「最新の勝ち」であるという確信があります。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.4.1</version> 
    <executions> 
     <execution> 
     <id>enforce</id> 
     <configuration> 
      <rules> 
      <requireUpperBoundDeps /> 
      </rules> 
     </configuration> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin>