18

pom.xml では、依存関係のスコープとして compiletime と runtime を提供しますか? その意味は何ですか?これを理解するための適切な例をいくつか挙げてください。

4

2 に答える 2

45

以下はMavenドキュメントからの引用です

コンパイル

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

ランタイム

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

たとえば、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依存関係が推移的でないことです。

于 2013-10-23T12:36:53.863 に答える
1

アプリケーションを Java EE 準拠のサーバーにデプロイするとします。サーバーは、Java EE 標準を実装するすべてのライブラリーを提供するため、それらをアプリケーションと共にデプロイする必要はありません。

開発中は、クラスをコンパイルする必要があるため、コンパイル時のスコープを持つ Java EE ライブラリが必要になります。

ただし、実行時にアプリケーション サーバーによって依存関係が提供されます。Maven は、そのような場合に「提供された」スコープを使用します。

于 2013-10-23T11:56:29.807 に答える