16

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

したがって、これらは依存関係です。

  • マイ ライブラリ: サードパーティ ライブラリに依存
  • 私のアプリケーション: 私のライブラリに依存します

ただし、アプリケーションでコンパイル時にサードパーティのライブラリ クラスを使用できるようにしたくありません。これは、アプリケーションが大規模なチームによってサポートされているためであり、いくつかのクラス名といくつかのメソッド名が類似していることを考慮して、人々がアプリケーションでサードパーティ ライブラリのメソッドを誤って使用するのを防ぎたいからです。もちろん、サードパーティのライブラリは実行時にアプリケーションで利用できる必要があります。

すべての依存関係のスコープがcompileだった場合、目標を達成できません。Maven 3でこれを達成する方法はありますか?

4

7 に答える 7

20

非常に良い質問です。残念ながら、基本的な設計のため、Maven 3、2、またはその他のバージョンを使用してこれを行うことはできません。実際、アーティファクトの依存関係はスコープcompileで推移的であるべきであるため、あなたが求めているのは実際には望ましい理想的な動作です。runtimeしかし、このような設計はいくつかの問題を引き起こします。スコープに関するMavenの依存メカニズムの紹介で読むことができるように:compile

[それ自体がコンパイルの依存関係であるコンパイルの依存関係の推移的な依存関係を考慮する必要がある]代わりにランタイム スコープを使用することを意図しているため、すべてのコンパイルの依存関係を明示的にリストする必要があります。ただし、依存するライブラリがクラスを拡張する場合があります。別のライブラリを使用して、コンパイル時に使用できるようにする必要があります。このため、コンパイル時の依存関係は、推移的であってもコンパイル スコープのままです。

ご覧のとおり、実際に必要なのは、残念ながら実装が不可能なこの動作の適切な設計です。

于 2012-06-15T07:02:30.000 に答える
6

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

ただし、ライブラリを再設計して、コンパイル時の依存関係として必要であり、それ自体はサードパーティ ライブラリに依存しない API アーティファクトと、実行時依存としてのみ必要で依存する実装アーティファクトに分割することを検討する必要があります。サードパーティのライブラリ。

于 2015-10-20T20:00:29.160 に答える