2011-01-11 14 views
4

私は次のような状況へのアプローチを決定しようとしている:Maven:直接的かつ推移的な依存関係はどう対処していますか?

3つのMavenの成果物があります:A、B、Cの

BはAに依存して(すなわち、それはAのコードの一部を使用しています)

CはAとBの両方に依存します(つまり、AのコードとBのコードの一部を使用します)。

は、私は両方のBのためにAの同じバージョンを使用したいと仮定し、C.

何なアプローチを使用する必要がありますか?

1)AをCのpom.xmlの依存関係として宣言します。

Pro:CがAに依存することは明らかです。 Con:Aのバージョンが変更された場合は、複数の場所で更新する必要があります。 (BとCの両方)

2)Cのpom.xmlに依存関係を宣言しないでください。

プロ/コン:オプション1.

+0

Typo:「CはAとCの両方に依存している」と言ったら、「CはAとBの両方に依存する」と思います。 – Nishant

+0

あなたは正しいです。私はタイプミスを修正しました。 –

答えて

3

1)の反対側には、Cさんのpom.xmlでの依存関係として宣言します。

依存関係は可読です

依存関係は柔軟です。 BからAの依存関係を削除する場合は、Bに依存するプロジェクトについて考える必要はありません。

other answerで提案されているように、pom.xmlに直接依存関係を書き留めて、それ。

2)AをCのpom.xmlに依存関係として宣言しないでください。

ほとんどの場合、開発者はpom.xmlを参照しません。そして彼らが望むならば、彼らはmvn dependency:treeを使ってそれを見ることができ、推移的な依存関係を示すでしょう。

新しいバージョンのAがリリースされると、単一の変更点があります。複数の場所で依存関係を定義すると、すべての場所を更新することを忘れることがあります。その場合、Mavenは自動的に最新のものを使います。しかし、それはときどき刺す。

ほとんどの場合、このタイプの依存関係は一般的な知識(例:MyWebApp -> MyWebAppLib -> MySharedLibおよびMyWebApp -> MySharedLib)であり、各リリースの複数の場所でバージョンを更新するステップを追加しないようにしたいと考えているユーザーもいます。

私は賛否両論を書いていますが、自分に合ったものを評価してください。


編集#1: TSK!私は私のコメントを切り替えました。
編集#2:は、this answerでのディスカッションの後に答えを更新しました。

+0

@Jin Kim私はオプションを誤解しています。だから私は間違った順序でコメントしていた。修正しました。 – Nishant

+0

オプション(A)は、オプション(1)を意味しますか? –

+0

@Jin Kim私は何らかの意味での投稿を更新しました。あなたのオプションを誤って貼り付けていました。 – Nishant

4

あなたはあなたのpomに宣言されているすべての直接の依存関係を持つべきだと思います。推移的依存関係は、依存関係の依存関係を自動的に解決するための便利な機能です。

直接依存関係のバージョンを変更した場合、推移依存関係が変更されてモジュールが破損する可能性があります。モジュールは独立したユニットとして構築する必要があります。したがって、外部の変更によって中断されない依存関係が明確に定義されている必要があります。

これは、mavenが単一のプロジェクトとそのpomの範囲内のものを定義するので、これはDRYプリンシパルに違反すると私は同意します。そして、この範囲内で繰り返しはありません。

更新: 既存の推移依存関係への依存は、それ自身のプロジェクトが虚弱になり、また、それを含めるようにするときのような、より複雑な問題につながる可能性があります。

たとえば、CにAに対するコンパイル依存性があり、Bに対するランタイム依存性がある場合は、依存関係を(ビルドパスに含まれていないため)追加するか、Bをコンパイルとして宣言する必要がありますそうではありません。明確にするためには、多くのことが言われています。依存関係が何であるか、そのスコープが何であるかを明示的に定義し、依存関係にも同じことを期待してください。ほとんどの場合、依存関係は問題を引き起こして開く必要があるまで、ブラックボックスになっています。

+0

クラスパスに同じアーティファクト/ jarの2つのバージョンがあると、混乱(Jar-hell)が発生する可能性があります。依存するプロジェクト(BとC)の両方で単一のバージョンを使用する可能性が非常に高いです。 Aのバージョンを更新する場合は、2つのPOMで同じものを更新する必要があります(繰り返し)か、バージョンの問題がある可能性があります。だから私はドライを言いました。 – Nishant

+1

Cは実際Aに依存しており、明示的に述べるべきです。推移的依存性「C→B→A」はBの実装の詳細であり、変更される可能性があります。あなたはそれを知っていても気にしてはいけません。実際には、Jarバージョンの地獄に導くことができますが、その問題を警告して解決するためには、ツールチェーン内の地位を考慮して、Mavenの一部でなければなりません。 –

+1

@Nishant - 私はmavenがjarを解決するのを手伝ってくれました。クラスパスに2つを入れないで、どちらを入れるかを決めました。私が言ったように、プロジェクトは独立していて、そのように設定する必要があります。推移的な依存関係への依存は、依存関係が実際にどのようなものなのかを単純に難解にします。これは、外部の変更によりプロジェクトがより脆弱になるため、管理が難しくなります。 – Robin

関連する問題