40

I have read the documentation and have some understanding.

Please correct or inform me of the truth; as per my understanding:

  • provided
    The dependencies must will be on the machine you run the code on, and must be included in the path

  • compile
    The dependencies will not be on the machine that runs the code, so include them in the build

  • system
    Exactly the same as provided, but you need the dependencies to be present in a jar file strictly

  • import
    Seems like it should import the dependencies from some other POM file but I don't know how/why, so a little elaboration would be appreciated

4

2 に答える 2

57

あなたは について間違っています/あいまいですprovided。これは、「この jar はローカルでコンパイルする必要がありますが、実行時に他の何かによってクラスパスに提供されるため、クラスパスに含めないでください」という意味です。たとえば、すべての Web コンテナ (例: tomcat) には、サーブレット用の jar が含まれています。providedコードをローカルでコンパイルできるようにサーブレット クラスに使用する必要がありますが、デプロイ時に tomcat が提供するサーブレット クラスをオーバーライドしたくありません。


system「これらの依存関係は私のシステムにあり、それらを直接参照したい」という意味です。別のコンピューター上の別の人が必ずしもこれらの依存関係を持っているとは限らないため、可能であればこれを避けたいと考えています。

違いprovidedは簡単に表示できます。

<dependency>
  <groupId>javax.sql</groupId>
  <artifactId>jdbc-stdext</artifactId>
  <version>2.0</version>
  <scope>system</scope>
  <systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>

それがどのように持っている<systemPath>か見てください。それが違いです。providedリポジトリから依存関係を取得する方法を知っている場合は 、でパスを指定しません。ファイルシステムからのみsystem取得します。


聞いたこともありませんimport。@JigarJoshi はhttp://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.htmlにリンクされています。

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

このスコープは、セクション内のタイプ pom の依存関係でのみ使用され<dependencyManagement>ます。これは、指定された POM をその POM のセクションの依存関係に置き換える必要があることを示します。それらは置き換えられるため、インポートのスコープを持つ依存関係は、依存関係の推移性の制限に実際には関与しません。

これは、「このプロジェクトのすべての依存関係を取得して、このセクションにインライン化する」ということだと思います<dependencyManagement>私が間違っている場合は、誰かが私を修正してください。

于 2013-06-03T23:58:46.480 に答える
21

Mavenでスコープの正確な意味を見つけてください

Maven http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.htmlを参照しました

依存関係スコープは、依存関係の推移性を制限するために使用され、さまざまなビルド タスクに使用されるクラスパスに影響を与えるためにも使用されます。

利用可能なスコープは 6 つあります。

  • コンパイル:

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

  • 提供:

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

  • ランタイム:

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

  • テスト:

    このスコープは、依存関係がアプリケーションの通常の使用には必要なく、テストのコンパイルおよび実行フェーズでのみ使用できることを示します。

  • システム:

    このスコープは、それを明示的に含む JAR を提供する必要があることを除いて、提供されたものと似ています。アーティファクトは常に利用可能で、リポジトリで検索されません。

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

    このスコープは、セクション内のタイプ pom の依存関係でのみ使用されます。これは、指定された POM をその POM のセクションの依存関係に置き換える必要があることを示します。それらは置き換えられるため、インポートのスコープを持つ依存関係は、依存関係の推移性の制限に実際には関与しません。

于 2014-10-10T13:27:41.823 に答える