web-dev-qa-db-ja.com

スコープが「インポート」の場合と「インポート」のない場合の「pom」タイプの依存関係の違いは何ですか?

Maven 2.0.9以降、含めることができる可能性があります

<type>pom</type>
<scope>import</scope>

<dependencyManagement>セクション。

私が理解しているように、このpomに含まれる依存関係は、元々ここで定義されているかのように「置換」されます。

上記のソリューションとimportスコープなしのこのPOMへの単純な依存関係の違いは何ですか(後者は「依存関係グループ化」と呼ばれています)。そのような「グループ化された」依存関係は、依存関係の優先順位を解決する際に優先順位が低いという唯一の違いはありますか?

98
grafthez

インポートできるのは管理対象依存関係のみです。これは、他のPOMをプロジェクトのPOMのdependencyManagementセクションにimportしかインポートできないことを意味します。つまり.

...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>other.pom.group.id</groupId>
            <artifactId>other-pom-artifact-id</artifactId>
            <version>SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>   
    </dependencies>
</dependencyManagement>
...

すると、other-pom-artifact-iddependencyManagementセクションで定義されたすべての依存関係がPOMのdependencyManagementセクションに含まれます。その後、dependencyなどを含めることなく、POM(およびそのすべての子POM)のversionセクションでこれらの依存関係を参照できます。

ただし、POMでother-pom-artifact-idへの通常の依存関係を定義するだけの場合、other-pom-artifact-iddependenciesセクションのすべてのdependencyはプロジェクトに推移的に含まれますが、定義される依存関係other-pom-artifact-iddependencyManagementセクションにはまったく含まれていません。

したがって、基本的に、2つの異なるタイプの依存関係(管理対象依存関係と通常の依存関係)をインポート/含めるために、2つの異なるメカニズムが使用されます。

MavenのWebサイトには、これよりもはるかに優れた説明ができる良いページがあります Mavenの依存関係管理 また、 依存関係のインポート に関する特定の情報も含まれています。

167
DB5

pomタイプのプロジェクトを別のプロジェクトのsimple dependencyとして使用することはできません。 (まあ、できます-しかし、それは何の役に立つこともしません)。 parent-child関係のみが可能です。これは基本的にmanaging dependency through inheritanceです。

<dependencyManagement>セクションのimport型依存関係のpomスコープにより、multiple inheritanceと同等の機能を実現できます。

異なるpoms-それぞれmanagingに関連する依存関係の束を持つことができます。これらを使用するプロジェクトはimportこれらpomsを使用し、バージョンを気にすることなく必要な依存関係を指定できます。これは基本的にbill of materialsの概念であり、@ DB5で指定されたリンクに示されています。

これにより、複雑なマルチモジュールプロジェクトのparent pomsが大きくなりすぎて扱いにくくなります。

13
Raghuram

オブジェクト指向プログラミングのパラダイムに非常によく似た2つの概念が、質問に答えるのに役立ちます。

  1. dependencyManagementセクションは、現在のプロジェクトの依存関係とその詳細のみを宣言します-目的は詳細を管理し、継承を介して他のプロジェクトで再利用することです(parent)またはimport(scope)これは、プログラムでデータ型を宣言し、使用できるようにすることと似ています。

  2. dependencyセクションは、プロジェクト内の依存関係の実際の使用を定義し、オプションで詳細(バージョンなど)を継承します。 )dependencyManagmentで宣言された依存関係の。そのため、dependencyManagmentにのみ依存関係を置くと、依存関係が失われます。これは、必要な場合にプログラムでデータ型の変数インスタンスをインスタンス化することに似ています。

5
Van