2012-06-15 4 views
11

Mavenを使用している2つのプロジェクトがあります。最初のものはユーティリティクラスとメソッドを含むライブラリです。 2番目のプロジェクトは、依存関係としてライブラリを持つ実際のアプリケーションです。私のライブラリは、サードパーティのライブラリを内部的に使用しています。Mavenのランタイムスコープへの推移依存性の制限

したがって、これらの依存関係です:

  • マイライブラリ:マイアプリ
  • サードパーティのライブラリに依存します。しかし、私のライブラリに

を依存し、私はしたくありませんサードパーティのライブラリクラスは、コンパイル時にで利用可能になります。これは、アプリケーションが大規模なチームによってサポートされているため、いくつかのクラス名といくつかのメソッド名が類似しているため、アプリケーションでサードパーティのライブラリのメソッドを誤って使用しないようにしたいのです。もちろん、私のアプリケーションでは、第三者のライブラリがランタイムで利用可能でなければなりません。

私のすべての依存関係の範囲がのコンパイルだった場合、私の目標を達成できませんでした。 Maven 3でこれを実現する方法はありますか?

答えて

16

非常に良い質問ですが、残念なことにMaven 3、または2、または他のバージョンを使用してこの基本的な設計を行うことはできません。実際にはどのアーチファクトのcompile依存関係もruntimeスコープで推移的でなければならないので、あなたが求めているのは実際には理想的で理想的な動作です。しかし、このようなデザインはいくつかの問題を引き起こします。あなたはMaven's Introduction to the Dependency Mechanismについてcompile範囲で読むことができるよう: - しかし、ライブラリはあなたが依存 場合があり

すべての コンパイルの依存関係を明示的にリストされる必要があるように、これは、代わりに、実行時の範囲であるべきことが意図されていますonは別の ライブラリのクラスを拡張し、コンパイル時に利用できるようにします。この の理由により、コンパイル時の依存関係は、 が推移している場合でもコンパイルスコープとして残ります。

実際、この動作の適切な設計は必要ですが、実装するのは残念ながら不可能です。

+1

私はそれを行う方法があった期待していました。あなたの答えをありがとう、Michal。 – Juanal

+0

これは数年前に答えられました。今これを行う方法はありますか?私はあなたが何とか 'import 'のスコープを使ってここで解決策をハックすることができるかどうか疑問に思っていますか? –

+1

私はここで何も変わったとは思わない。 2012年に言ったように、それは非常に基本的なMavenデザインです。私は、Mavenが最初から何かをやっているかのように、今これを変更する方法はないと信じています。 –

4

ミハエルの答えはまだ正しいので、過去3年間は何も変わっていません.Mavenの推移的な可視性を制限する方法はありません。

しかし、コンパイル時間依存性として必要なapiアーティファクトで分割するようにライブラリを再設計し、サードパーティのライブラリとランタイム依存性としてのみ必要な実装成果物に依存しないライブラリを考慮する必要があります第三者のライブラリに依存しています。

2

アプリケーションでは、「ランタイム」スコープを使用してサードパーティライブラリに明示的な依存関係を宣言することができます。

これにより、コンパイル時にサードパーティのライブラリが表示されなくなり、直接使用することができなくなります。ただし、実行時にはライブラリに必要なので、まだ存在します。

これはうまくいくものの、pomには説明的なXMLコメントが必要です。

0

他の回答は正しいです。人工的なAPIのみのモジュールを分割することにより、Mavenの中に欠けている重要な機能を中心に周りの作業に加えて、あなたはまた、これらの選択肢があります。

  • を推移的な依存を排除​​し、その後、あなたはバージョン番号を管理しなければならない(直接それらに依存
  • checkstyleインポートコントロールとCIを使用します。そうすれば、チームメンバはトランジッションを使用することができますが、Mavenベリファイは失敗します。
  • gradleを使用します。 mvn dependency:analyzeまたは検証ライフサイクル・フェーズの一部として分析の依存関係を持っている:これは、あなたがして依存関係を分析することができますMavenの
  • の多くの制限
関連する問題