2011-07-11 6 views
177

多分この質問はちょっとしたようですが、何とか私を悩まします。アーティファクトがJARとしてビルドされているときに、Mavenスコープcompileprovidedを使用した場合の違いは何ですか?それがWARなら、私は理解します。アーティファクトはWEB-INF/libに含まれるかどうかです。しかし、JARの場合、依存関係は含まれません。スコープがcompileまたはprovidedの場合、クラスパスにする必要があります。私はprovidedの依存関係は推移的ではないことを知っていますが、それは唯一の違いですか? Maven DocからMavenスコープの違いはコンパイルされ、JARパッケージ化のために提供されます

答えて

201

  • は、これは何も指定されていない場合に使用される、デフォルトのスコープです

コンパイルします。コンパイル 依存関係は、プロジェクトのすべてのクラスパスで使用できます。 さらに、これらの依存関係は依存するプロジェクトに伝播されます。

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

要約:(あなたが述べたように)

  • 依存関係が推移的ではありません
  • 提供範囲は、一方のスコープは、すべてのクラスパスで利用可能ですコンパイルし、コンパイルとテストクラスパスでのみ利用可能です。あなたはそのすべての依存関係(一般的なXXXX-all.jarを)持つ単一のJARファイルを生成するために計画している場合
  • 提供の依存関係が
+3

はい、わかります。しかし、私は 'JARパッケージング'コンテキストでスコープの違いについて熟考しています。 Mavenのdocはそれについて言及しません。 私はしばらくMavenを使っていますが、私はすでにそれについて質問しています:) 'JARパッケージング'コンテキストでは 'compile'と' provided'の間に違いはないようです依存関係遷移)。私は正しい? – emstol

+0

"classpath-availability"、はい。 – Jacob

+1

@Jacob "コンパイルスコープは*すべてのクラスパス*で利用可能ですが、"とは何を意味していますか? – Geek

10

をパッケージ化されていない、そして、スコープの問題を提供し、この内部クラス理由スコープは生成されるJAR内ではパッケージ化されません。

詳細については

+2

dependency ==>依存関係は**パッケージ化されません**。 –

+0

OP混乱は、 'maven-assembly-plugin'を使ってパッケージ化すると、明らかに解決されます。最も重視されている答えには言及していません。 –

+0

私はこの答えを理解していません。それはコメントのように見えます。 – reinierpost

217

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

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

Webアプリケーションの場合、アプリケーションサーバーがすでにJAR(またはその機能性)を提供している場合は「提供済み」を使用し、そうでなければ「コンパイル」を使用します。

Here is the reference.

+4

あなたはOPの質問に答えていませんか? 'アーティファクトが** JAR **としてビルドされているときに、コンパイルして提供するものは何か?'と書かれています。作者は戦争としてパッケージングするときの違いを知っていることを明示しています。 – Alberto

+0

同じアプリケーションサーバーにデプロイされた別のJARを参照している場合は、私は提供することができますか? –

+1

明快にするために、 'mvn exec:java'が実行されてもコンパイルされた依存関係が存在する場合、提供された依存関係はクラスパスに追加されません。 – Jamie

6

をコンパイルし、クラスパスに使用できるようにし、それは通常のjarファイルであれば、最終的な瓶の中にこの依存関係を追加しないでください。最終的にjarファイルがが

依存関係は、実行時環境で利用できるようになりますので、追加していない提供

  • (例えば、実行可能なjarファイル)単一のjarがある場合はジャーにこのjarファイルを追加いずれにしてもこの依存関係。 (つまり、実行可能なjarなど)

2

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

私のペットのかわいこの1つは、これらの2つの単語が同じ緊張を持つべきであるということです。コンパイルして提供するか、コンパイルして提供するかのどちらかです。ここ

13

は、サポートされているすべての依存関係(ソースmaven doc)についての簡単な

は、これは何も指定されていない場合に使用されるデフォルトのスコープ、ある

をコンパイルしています。コンパイルの依存関係は、プロジェクトのすべてのクラスパスで使用できます。さらに、これらの依存関係は依存するプロジェクトに伝播されます。

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

ランタイム

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

試験

この範囲は、依存関係は、アプリケーションの通常の使用のために必要とされていないことを示し、そして試験のコンパイルと実行フェーズでのみ使用可能です。この範囲は推移的ではありません。

システム

このスコープは、明示的に含まれているJARを提供しなければならないことを除いてに似ています。アーティファクトは常に利用可能であり、リポジトリで参照されません。この範囲のみセクションのタイプのPOMの依存性に支持されている(Mavenの2.0.9以降でのみ使用可能)

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

関連する問題