web-dev-qa-db-ja.com

Maven依存関係の解決とスコープのオーバーライド

免責事項

(私はもともと非常に詳細な方法で質問をしました ここmaven-usersメーリングリストがこの質問について沈黙しているので、ここでそれを抜粋しました。)(単に別の初心者の質問ではありません)

参照

私の参考資料は http://maven.Apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management ;です。これが古いか間違っている場合は、このディスカッションでお知らせください。

質問

そのドキュメントには、「2番目の非常に重要な...」で始まるセクションがあります。以下では、そのセクションのプロジェクトAおよびBを参照し、それらから抜粋します。

そのセクションでは、プロジェクトA<dependencyManagement>セクションがあり、スコープcを持つアーティファクトcompileを定義していることがわかります。

<!-- In A's pom.xml; condensed for brevity -->
<dependencyManagement>
    <dependency>
        <groupId>test</groupId>
        <artifactId>c</artifactId>
        <version>1.0</version>
        <scope>compile</scope> <!-- look: compile scope -->
    </dependency>
</dependencyManagement>

次に、プロジェクトBpom.xmlが表示されます。これは、(a)プロジェクトAから継承され(したがって、そのdependencyManagementセクションを継承します)、(b)アーティファクトへの依存関係を確立しますcversionを指定する必要はありません。また、アーティファクトcの依存関係がcではなくruntimeになるようにcompileをオーバーライドすることにも注意してください。

<!-- In B's pom.xml, whose parent is A's pom.xml (above); condensed for brevity -->
<dependencies>
    <dependency>
        <groupId>test</groupId>
        <artifactId>c</artifactId>
        <scope>runtime</scope> <!-- look: runtime scope -->
    </dependency>
</dependencies>

繰り返しますが、<version>要素はありませんが、<scope>runtime</scope>要素はあります。

これについての私の解釈は、すべてが言い終えられたとき、Bは、cスコープのアーティファクト1.0のバージョンruntimeに依存するということです。 、compileスコープではありません。

あれは正しいですか? My maven-ear-pluginバグ は、これが予想される動作であるという事実に基づいています。 maven-ear-plugin.earファイルをビルドするときに起こることではありません。

次に、それが正しい場合、アーティファクトcに推移的なruntimeの依存関係がある場合、それらはBruntimeクラスパス(やや不可解なものによって定義される)で使用可能になることも期待します http://maven.Apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope )の表.

あれは正しいですか?

32
Laird Nelson

上記で指定した バグリンク に投稿されたサンプルプロジェクトでmvn dependency:treeを実行すると、

[INFO] Building MEAR-143 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143 ---
[INFO] ljnelson:mear-143:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.8.2:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MEAR-143 Leaf 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143-leaf ---
[INFO] ljnelson:mear-143-leaf:jar:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.8.2:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MEAR-143 Middle 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143-middle ---
[INFO] ljnelson:mear-143-middle:jar:1.0-SNAPSHOT
[INFO] +- ljnelson:mear-143-leaf:jar:1.0-SNAPSHOT:runtime
[INFO] \- junit:junit:jar:4.8.2:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building MEAR-143 EAR 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ mear-143-ear ---
[INFO] ljnelson:mear-143-ear:ear:1.0-SNAPSHOT
[INFO] +- ljnelson:mear-143-middle:jar:1.0-SNAPSHOT:runtime
[INFO] |  \- ljnelson:mear-143-leaf:jar:1.0-SNAPSHOT:test (scope managed from ru
ntime)
[INFO] \- junit:junit:jar:4.8.2:test

依存関係が明示的に定義されているmear-143-leafmear-143-middleの依存関係scopeは、実際にはruntimeであり、親pomのtestセクションで定義されているdependencyManagementスコープをオーバーライドしますmear-143

mear-143-earには、mear-143-leafが含まれますtransitively。ここで、mear-143testで定義されているdependencyManagementスコープは、継承されたruntimeスコープよりも優先されます。

これは、上記で参照したセクションの2番目の箇条書きで指定されているものと一致していると思います。ここでそれを引用し、関連部分を太字と斜体で強調表示します。

bはBの親の依存関係管理セクションで定義されており、依存関係管理は推移的依存関係の依存関係メディエーションよりも優先されるため、それが参照される場合はバージョン1.0が選択されますaまたはcのpom。 bにもコンパイルスコープがあります

24
Raghuram