UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Maven】<optional> true</optional>と<scope>provided</scope>の違い

あるライブラリに対して<optional> true</optional><scope>provided</scope>を両方設定しているモジュールがあり、どちらもユーザーが任意に使用することを意味するものだと思っていたので、両方を設定する意味の違いがわらなかったので調べた

optional= true

<optional> true</optional>はあるモジュール内の任意の機能だけで使いたいモジュールがある場合、その機能を使用しない限りクラスパス上に存在しないようにする設定

例えば5つの異なるデータベースタイプでライブラリを使用できるようにしておくが、通常は1つだけが必要な場合に、ライブラリに依存する依存関係をoptional= trueとしてマークしておき、ユーザーが実際に使用する依存関係を指定できるようにする場合などに使用する

scope=provided

<scope>provided</scope>コンパイル時にクラスパスに追加されるもので<optional> true</optional>とは似たような話だが意味的に違う

ランタイム環境ですでに提供されているためパッケージ化する必要がないことを意味する

例えば、Lombokなどはコンパイル時に使用したら、ランタイムでは必要ないライブラリである

こういうライブラリに対して設定を行う

つまり、以下の設定は「コンパイル時だけ必要だが、もし使ってないならクラスパスには追加しない」という設定ということがわかった

    <optional>true</optional>
    <scope>provided</scope>