web-dev-qa-db-ja.com

MavenスコープのコンパイルとJARパッケージの提供の違い

成果物がJARとして構築されている場合、mavenスコープcompileprovidedの違いは何ですか?それがWARであれば、私は理解しています - 成果物はWEB-INF/libに含まれるか含まれないでしょう。しかし、JARの場合は関係ありません - 依存関係は含まれていません。スコープがcompileまたはprovidedの場合、それらはクラスパス上になければなりません。 providedの依存関係は推移的ではないことを私は知っています - しかしそれはただ一つの違いですか?

233
emstol

Maven Docから

  • コンパイル

    これがデフォルトのスコープで、何も指定されていない場合に使用されます。コンパイル依存関係は、プロジェクトのすべてのクラスパスで利用できます。さらに、それらの依存関係は依存プロジェクトに伝播されます。

  • 提供された

    これはコンパイルに非常に似ていますが、実行時にJDKまたはコンテナが依存関係を提供することを期待していることを示しています。たとえば、Java Enterprise Edition用のWebアプリケーションを構築するときは、Webコンテナがこれらのクラスを提供するため、サーブレットAPIおよび関連するJava EE APIへの依存関係を提供されるスコープに設定します。このスコープはコンパイルおよびテストクラスパスでのみ利用可能で、推移的ではありません。

要約:

  • 依存関係は推移的ではありません(あなたが言ったように)
  • 指定されたスコープはコンパイルおよびテストクラスパスでのみ利用可能ですが、コンパイルスコープはすべてのクラスパスで利用可能です。
  • 提供された依存関係がパッケージ化されていない
260
Jacob

コンパイルとは、アプリケーションのコンパイルと実行にJARが必要であることを意味します。Webアプリケーションの場合、例として、JARはWEB-INF/libディレクトリに配置されます。

コンパイルするためにJARが必要であることを意味しますが、実行時にはすでに環境によって提供されているJARがあるので、アプリと一緒にパッケージ化する必要はありません。つまり、JARファイルはWEB-INF/libディレクトリに配置されません。

Webアプリの場合、アプリサーバーがすでにJAR(またはその機能)を提供している場合は、 "provided"を使用します。それ以外の場合は "compile"を使用します。

これが参考です。

262
Owen Cao

これはサポートされているすべての依存関係についての概要です(source maven doc )。

コンパイル

これがデフォルトのスコープで、何も指定されていない場合に使用されます。コンパイル依存関係は、プロジェクトのすべてのクラスパスで利用できます。さらに、それらの依存関係は依存プロジェクトに伝播されます。

提供された

これはコンパイルに非常に似ていますが、実行時にJDKまたはコンテナが依存関係を提供することを期待していることを示しています。たとえば、Java Enterprise Edition用のWebアプリケーションを構築するときは、Webコンテナがこれらのクラスを提供するため、サーブレットAPIおよび関連するJava EE APIへの依存関係を提供されるスコープに設定します。このスコープはコンパイルおよびテストクラスパスでのみ利用可能で、推移的ではありません。

ランタイム

このスコープは、依存関係がコンパイルには必要ではなく、実行には必要であることを示しています。実行時クラスパスとテストクラスパスにありますが、コンパイルクラスパスにはありません。

テスト

この範囲は、依存関係がアプリケーションの通常の使用には必要ではなく、テストのコンパイル段階と実行段階でのみ使用可能であることを示しています。この範囲は推移的ではありません。

システム

このスコープは、明示的にそれを含むJARを提供しなければならないことを除いて、providedと似ています。成果物は常に使用可能であり、リポジトリー内で検索されません。

インポート(Maven 2.0.9以降でのみ利用可能)

このスコープは、セクション内のpom型の依存関係でのみサポートされています。これは、指定されたPOMのセクション内の依存関係の有効リストに置き換えられるべき依存関係を示します。それらが置き換えられるので、インポートの範囲を持つ依存関係は、依存関係の推移性を制限することに実際には関与しません。

17
Indra Uprade

すべての依存関係を持つ単一のJARファイル(一般的なxxxx-all.jar)を生成することを計画している場合は、提供されるスコープが重要になります。このスコープ内のクラスは結果のJARにパッケージ化されないためです。

詳しくはmaven-Assembly-pluginを見てください。

16
jfcorugedo
  • コンパイル

クラスパスで利用できるようにします。通常のjarの場合はこの依存関係をfinal jarに追加しないでください。ただし、最後のjarが単一のjarの場合は、このjarをjarに追加します(たとえば、実行可能jar)。

  • 提供された

依存関係は実行時環境で利用可能になるので、いかなる場合でもこの依存関係を追加しないでください。単一のjarファイルにも含まれていない(つまり実行可能なjarファイルなど)

9
Vijay

Jarファイルでは、maven-jar-plugin構成でaddClassPathがtrueに設定されている場合、違いはjarに含まれているMANIFEST.MFファイルにリストされているクラスパスにあります。 'コンパイル'依存関係はマニフェストに表示されますが、 '提供'依存関係は表示されません。

私のお気に入りの1つは、これら2つの単語が同じ時制を持つべきだということです。コンパイルして提供するか、コンパイルして提供します。

3
Rick