回答:
Maven Docから:
コンパイル
これはデフォルトのスコープであり、何も指定されていない場合に使用されます。コンパイルの依存関係は、プロジェクトのすべてのクラスパスで使用できます。さらに、これらの依存関係は依存プロジェクトに伝達されます。
提供
これはコンパイルによく似ていますが、JDKまたはコンテナが実行時に依存関係を提供することを期待していることを示しています。たとえば、Java Enterprise EditionのWebアプリケーションを構築する場合、Webコンテナがこれらのクラスを提供するため、サーブレットAPIおよび関連するJava EE APIへの依存関係を提供されたスコープに設定します。このスコープは、コンパイルとテストのクラスパスでのみ使用でき、推移的ではありません。
要約:
compile
そうでない場合はそうではありませんprovided
。
コンパイルとは、アプリをコンパイルして実行するためにJARが必要であることを意味します。Webアプリケーションの場合、例として、JARはWEB-INF / libディレクトリに配置されます。
提供されるとは、コンパイルにJARが必要であることを意味しますが、実行時にはすでに環境によって提供されるJARが存在するため、アプリにパッケージ化する必要はありません。Webアプリの場合、これはJARファイルがWEB-INF / libディレクトリーに配置されないことを意味します。
Webアプリの場合、アプリサーバーがすでにJAR(またはその機能)を提供している場合は、「提供」を使用します。それ以外の場合は「コンパイル」を使用します。
mvn exec:java
実行時に、提供された依存関係はクラスパスに追加されませんが、コンパイルされた依存関係は追加されます。
すべての依存関係(一般的なxxxx-all.jar)を含む単一のJARファイルを生成する場合は、提供されるスコープが重要です。このスコープ内のクラスは、生成されるJARにパッケージ化されないためです。
詳細については、maven-assembly-pluginを参照してください
maven-assembly-plugin
、でパッケージ化すると明らかに解決されます。興味深いのは、最も投票された回答で言及されていないことです。
JAR packaging
コンテキスト内のスコープの違いについて考えます。Maven docはそれについて言及していません。私はしばらくの間Mavenを使用していますが、私はすでにそれについて自分自身に質問しました:)したがって、JAR packaging
コンテキストではcompile
、provided
(依存関係の移行を除いて)の間に違いはないようです。私は正しいですか?