web-dev-qa-db-ja.com

バージョンなしのMaven依存関係

最近、私は少し前に開発されたプロジェクトでいくつかの改善に取り組んできましたが、ここに私が見つけたものがあります。 pomファイルの多くの依存関係はバージョンが指定されていなくても解決されます。プロジェクトは、1つのルートモジュールと2つのサブモジュールで構成されます。 Aggregatorパターンが使用されます。つまり、dependencyManagementセクションはまったくありません。上位プロジェクトは単に2つのモジュールを集約するだけで、それだけです。サブプロジェクトは親を参照しません。彼らは別の親を持っています。私が理解できないのは、サブプロジェクト自体もその親も(実際、dependencyManagementもありません)、いくつかの依存関係のバージョンを指定していないということです。例えば:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
</dependency>
<dependency>
    <groupId>com.Sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
</dependency>
<dependency>
    <groupId>com.Sun.mail</groupId>
    <artifactId>imap</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

誰かが私がこれを理解するのを助けることができますか? Mavenはデフォルトの戦略でバージョニングを処理していますか?そのデフォルト戦略は何ですか?

41
yuranos87

OK、私は自分で答えるつもりだと思います。もちろん、dependency:treeを調べましたが、言及したすべての依存関係は、ツリーの第1レベルのメンバーでした。すぐに気づかなかったのは、dependencyManagementが親に存在しないことですが、サブモジュールには存在しますが、さらに興味深いのは次のものが含まれていることです。

        <dependency>
            <groupId>io.spring.platform</groupId>
            <artifactId>platform-bom</artifactId>
            <version>1.0.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

Spring IO Platformを使用したことがないので、これは私にとってまったく新しい概念です。判明しているように、プラットフォームには事前構成された依存関係が多く含まれています。 http:// docs.spring.io/platform/docs/current/reference/htmlsingle/#appendix-dependency-versions

27
yuranos87

アーティファクトのバージョンを定義せずにMavenが機能することは不可能です。サブモジュールまたは親のdependencyManagementタグのどこかで定義する必要があります。 POM階層を確認してください。つかいます mvn help:effective-pomプロジェクトのサブモジュールディレクトリ。また、mvn dependency:treeどのアーティファクトを-バージョン番号を含む完全なアーティファクト情報とともに-依存関係管理の結果で解決するかを見つけるため。

18
Ozgen