web-dev-qa-db-ja.com

Mavenで「提供された」スコープを持つ「オプションの」依存関係

Mavenは時々頭を悩ませます... slf4jとlog4jにオプションで依存するライブラリを作成しました。オプションとは、次のことを意味します。

  • 私のライブラリはコンパイル時にそれらのロギングフレームワークを必要とします
  • 私のライブラリは実行時にそれらを必要としませんが、それらを「発見」すると、それらを使用します

現在、私はその依存関係を「オプション」および「提供」としてマークしています。

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
    <type>jar</type>
    <scope>provided</scope>
    <optional>true</optional>
</dependency>

しかし、log4/slf4jを必要としないため、一部のユーザーから問題が報告されています。私の依存関係は正しいですか?残念ながら、公式ドキュメントは少し抽象的すぎてこの問題を理解できません。

30
Lukas Eder

this ドキュメントを確認しましたか。それはあなたのユースケースを非常によく説明しています。依存関係をオプションとしてマークしても、ライブラリを使用するアプリケーションでは、依存関係は推移的な依存関係として解決されません(スコープがcompileであっても)。

ランタイム環境によって提供される必須の依存関係に使用される<scope>provided</scope>とは異なり、<optional>true</optional>の依存関係は必ずしも必須ではありません(という考え方です。一部の依存関係は、プロジェクト内の特定の機能にのみ使用され、その機能が使用されていない場合は必要ありません。)。

ライブラリを使用するプロジェクトがオプションの依存関係によって提供される機能を使用する場合、プロジェクトはこれらの依存関係を独自に宣言する必要があります。

あなたの設定は私にとって正しいように思われるので、私は問題が発生する理由を知りません。たぶん、オプションの依存関係は、予期しないバージョンの他のライブラリによって解決されます。もちろんそれは問題を引き起こすかもしれません。

34
FrVaBe