pom.xml では、依存関係のスコープとして compiletime と runtime を提供しますか? その意味は何ですか?これを理解するための適切な例をいくつか挙げてください。
2 に答える
コンパイル
これはデフォルトのスコープで、何も指定されていない場合に使用されます。コンパイルの依存関係は、プロジェクトのすべてのクラスパスで利用できます。さらに、それらの依存関係は依存プロジェクトに伝播されます。
ランタイム
このスコープは、依存関係がコンパイルには必要ないが、実行には必要であることを示します。これはランタイムおよびテスト クラスパスにありますが、コンパイル クラスパスにはありません。
たとえば、POM に次の 2 つの依存関係があるとします。
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1.3</version>
<scope>compile</scope> <!-- can be ommitted as it is the default -->
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
<scope>runtime</scope>
</dependency>
次に、からのクラスcommons-logging-api
はモジュールのコンパイル中にクラスパスに存在しますが、からのクラスは使用できません。プロジェクトのクラスのいずれかでcommons-logging
からのクラスを誤って直接参照した場合、ビルドは失敗します。commons-logging
ただし、実行時またはテストのコンパイルと実行中に、commons-logging のクラスはクラスパス上にあるため、使用できます (つまり、 のクラスによってcommons-logging-api
、またはプロジェクトのテストで直接)。
プロジェクトが別のプロジェクトで依存関係として参照されている場合、Maven によって両方compile
の依存関係が推移的に (同じスコープの下で) 含まれます。runtime
ps kostjaが述べたように、provided
スコープもあります
提供された
これはコンパイルによく似ていますが、実行時にJDKまたはコンテナが依存関係を提供することを期待していることを示しています。たとえば、Java Enterprise Edition 用の Web アプリケーションを構築する場合、サーブレット API および関連する Java EE API への依存関係を提供範囲に設定します。これは、Web コンテナーがこれらのクラスを提供するためです。このスコープは、コンパイルおよびテスト クラスパスでのみ使用でき、推移的ではありません。
provided
基本的にとの違いcompile
は、provided
依存関係が推移的でないことです。
アプリケーションを Java EE 準拠のサーバーにデプロイするとします。サーバーは、Java EE 標準を実装するすべてのライブラリーを提供するため、それらをアプリケーションと共にデプロイする必要はありません。
開発中は、クラスをコンパイルする必要があるため、コンパイル時のスコープを持つ Java EE ライブラリが必要になります。
ただし、実行時にアプリケーション サーバーによって依存関係が提供されます。Maven は、そのような場合に「提供された」スコープを使用します。