2012-04-01 7 views
26

私は現在、Springの依存関係をFlywayから削除しています。将来的には、ユーザーのサブセット(JBoss VFSサポートなど)をサポートするために他の種類の依存関係が必要になるかもしれません。オプションの依存関係を処理するための最良の戦略

任意の依存関係をサポートする最も良い方法はです。(Maven POMではoptional = true)?溶液の

資質は次のようになります

  • エンドユーザのための使いやすさ(最小作業は依存関係が存在する場合に機能を使用するために必要)
  • 任意依存性を扱う開発者(コードの使いやすさ一部のエンドユーザーは、依存関係にプルする必要がこの機能を必要としないしない場合は不必要な必要な依存(
  • )として読みやすく、できるだけ簡単であるべきではありません)
+0

**更新:**ちょうど明確にするために、私はわからない程度だ事が ある - POMデザイン - ...対の両方の対複数のモジュール対反射 - 追加モジュールの自動検出かどうか、彼らが存在する場合/場合はい、どのように - ... –

+1

更新:http://www.axelfontaine.com/2012/08/optional-dependency-strategies-for-java:私は最終的にこのことについて包括的なブログ記事を書くことに周りに来ています。 html –

答えて

11

私はMavenのオプションの依存関係の機能はかなり限られていると思います。

http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

オプションの依存関係は、デフォルトでは(推移的依存関係として)引き下げられません。ただし、ユーザーがこれらのオプション機能を使用する必要がある場合、欠落している依存関係をPOMに明示的に宣言する必要があります。

個人的には、これがユーザーにとってどのように役立つかはわかりません....あなたのコードが依存するバージョンをPOMのオプションの依存関係が文書化していると思います。しかし、すべてのユーザーがPOMを読むわけではなく、「NoClassDef Found」というエラーが表示されます.-(

最終的には、ivyのような依存性マネージャのほうが柔軟性の高いまれなシナリオの1つです。 。。アイビーはモジュールの作者が「で、春」とは、例えば、依存関係のさまざまな組み合わせを組み立てることができたり、「なし - 春」「構成」と呼ばれる概念があり

+0

pomと依存バージョンについての良い点。物事のコード面はどうですか?どのようにモジュールを分割する/ NoClassDefFound/etcを避ける?展開してください。 –

+0

@martiellはあなたに利用できる次善の回避策の種類の優れた概要を与えている....私は本当にMavenの中でこれを行うには良い方法があるとは思いません。複数のMavenのモジュールを展開する、独自のカスタムPOMとのそれぞれがユーザーのための最高の、最も単純オプション(ただし、あなたのために多くの作業)であると思われます。 –

+0

ダガー2は、をよく使用しています。注釈コンパイラは、このモジュールをコンパイル中に使用できるようにするために使用しますが、このモジュールが他の成果物によって使用されているときは使用できません。 –

1

の選択肢があります:

  • は、プロジェクトを保ちます単一のモジュール内にあり、オプションの依存関係を使用する。
  • プロジェクトを複数のモジュールに分割します。各モジュールは任意のライブラリへの(オプションではなく)依存関係を持ちます。

ほとんどの場合、最初の方が理にかなっていると思います。ユーザーは、人工物の数を減らす必要があります。典型的には、新しい依存関係をpomに追加する必要があります。サードパーティのプロジェクトをサポートするコードが大きい場合を除き、ダウンロード時間の短縮に役立ちます(往復回数の削減)。後者のアプローチでは、ユーザーが独自のバージョンセットを定義しているが、サードパーティの依存関係の一部に対してのみ、不自然な状況にいることがあります。

私は、pomのオプションの依存関係を見ることが好きです(私は時にはそれがどのバージョンのものかを見ています)。一部の人々が見ないかもしれないことは事実です。私は、コピー&ペースト可能なポッドスニペットは、ウェブサイト上の最適な解決策だと思う。たとえば、Springの統合に関するページがある場合は、関連するpomスニペットをそのページに配置できます。

非自由な依存関係(または簡単には解決できないもの)を別のMavenモジュールに保存して、コントリビュータが常にプライマリアーティファクトを作成できるようにすることをお勧めします。 (私はIIRCがOracle JDBC jarにオプションの依存関係を持つQuartzに問題があった)。

編集:あなたは、ユーザーがNoClassDefFoundErrorsを見て心配している場合、それはクラスがそれを使用しようとする前に解決できることを確認するために、任意の害をしないだろう。たとえば、例外を指定して、ユーザにドキュメントを指示する意味のあるエラーメッセージを表示することができます。 SLF4Jはこれの良い例です。