2016-11-28 8 views
1

場合によっては、Maven Version Rangesを使用して依存関係を指定する問題がプロジェクトで発生します。Mavenでのビルド再現性と中間依存関係更新のトレード

拡張 "三段論法" はこのような何かを行く:

  • のApp Xは、内部(我々の組織の)依存Y
  • 依存Yは、外部依存関係Z(org.apache.httpcomponents:httpclientの例g:a
  • を持っています依存関係Zのプロバイダは、のバージョン番号(例えば、httpclient4.5.14.5.2の場合は、バグ修正のみを含み、APIの変更は含まないと仮定している)内で下位互換性を提供することについて非常に良いです。
  • App XがDependency Zの更新を利用したい場合は、Dependency Yの新しいビルドを必要としません。
  • 実際、依存関係Y1、Y2、Y3などもあります同様の機能(異なるWebサービスのクライアント)を使用し、同じバージョンのhttpclientに依存していて、.incrementalバージョンとは無関係です(関連するバグの修正を除いて)。

したがって、等依存Y、Y1、Y2は、依存Zのそのバージョンを有することができ、アプリケーションXを可能にする(「httpclientの任意のバージョン4.5.xは十分であろう」と言うためには、例えばhttpclient:[4.5., 4.6))範囲として指定されましたその依存関係の管理バージョンを指定して(つまり、内部的にバージョン自体を依存関係Yで指定された範囲内に修正する)、依存関係Zの新しい増分バージョンに「アップグレード」する必要がありますか?

依存性Y(および関連する)は、特定のバージョンの依存性Z(最新の既知ですが、わずかに古くなる可能性があります)をun-ranged <version>4.5.inc</version>として指定し続けているため、依存性Zが新しいバージョンでは、アプリケーションXは、次のオプションがあります

  1. は、再構築し、依存関係Zの
  2. アップデートの依存Yの述べたバージョンを(つまり、依存関係Yの優先バージョンを上書きする最新バージョンを強制)内部依存Zのバージョンを管理しますすべてのY1、Y2、Y3などを同じように実行してから、依存関係Y、Y1、Y2などのApp Xのバージョンを更新します。

しかし、 "私は依存性Zを実際に柔軟性として扱っていますが、#1の依存性Yのpom.xmlでそれを述べたくないのは不正です。

#2からの「トリクルダウンアップグレード」は現在の習慣であり、苦労しています。依存性Yファミリのコードに内部的な変更はなく、更新された依存性だけがあるため、ほとんど価値がないようです。上記の

観察:

  1. 「三段論法」の提案は違反しているようだ思考の学校を「バージョンを使用しない範囲」。 App Xは「再現性を構築する」がありますが、依存性Yは必ずしも限定されているわけではありませんが、限られた範囲では許容されるかもしれません。
  2. 代替1は、私が出会った「バージョン範囲を使用しない」投稿によって支持されているようです。
  3. 代替案2(現在の方法)は、App XとDependency Yの両方で「再現性」を確保するために必要な悪ですか?

したがって、重要な質問は、「トリクルダウンアップグレード」と「再現性の構築」の間にこの緊張感を感じないように、私が見落としているオプションや代替品があることです。

理想的には、「バージョンg:a:maj.min.incの依存関係Yを作成しますが、推移性はあいまいで、下流にはg:a:maj.min.?バージョンを受け入れます」という記述が理想的です。 Yさんは唯一のXまたは同様の文脈で使用されている場合は、私は二つのオプションを見ることができます

+0

これは良い質問です...あなたが言うように、2つのアプローチがありますが、どのようにそれらを第3のものにマージできるかはわかりません。ビルドで使用される依存関係と、消費者の推移的依存関係になる依存関係は同じです...あなたはYからZ依存関係を取り除くことができますが、XはZに完全に依存しますが、 ... – Tunaki

答えて

1

...

、あなたはZまでのレベルに依存関係を移動することができます - バージョンの範囲とY(にprovidedとしてそれを定義します)と、バージョン範囲のあるXの第1レベルの依存関係です。このようにYの依存関係は実際にあなたが望むもの(その範囲の最新バージョン)になり、Xの各ビルド中に常に最新のバージョンに満足します。

Yの意志Zのいくつかのバージョンでビルドされ、最新のものではないかもしれません。あなたが言ったように、最新のバージョンが必要な場合は、現在のところ唯一の選択肢は、更新を無効にする(または更新を細くする)ことです。それはその不正直ではありません:Yの.pomファイルの範囲指定子は、必要に応じて依存関係がオーバーライドされる可能性があるというX実装者へのヒントになります。

+0

私の経験(ここで説明します:http://stackoverflow.com/questions/40851764/maven-version-range-to-exclude-next-minor-version)に基づいて、私はもはや範囲をオプションとみなさず、 'Maven Version Ranges are Evil' Kool-Aidの長いドラフトを撮った。適切な問題に対処するためにZが修正されている場合は、私が "細流化"を続けるか、またはYのZのバージョン番号を更新するかどうかはまだ決めていません。 –

+0

'提供された'を使うことは問題です。私は、プロジェクトYがZに依存している(「提供された」とマークされている)状況に私を素早く裁判しました。 Project XがYに依存し、Zに直接依存しない場合、Project XはProject Zを依存関係として明示的に指定する必要があります。そうしないと、コンパイルされません。これは、そうでなければ必要ない場所にZを指定することによって、「推移的」依存関係の便宜性を取り除きます。トリクルダウンやプロジェクトの上書きを行う方法があります。 –

関連する問題