web-dev-qa-db-ja.com

Maven依存関係の順序が重要な理由

Mavenの依存関係の順序は以前は重要ではないと考え、これを賛成だと考えました。そして、これは私の古いpom.xmlの依存関係:

<dependencies>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.19</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.1.7.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-spring3</artifactId>
        <version>2.19</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <version>2.19</version>
    </dependency>

</dependencies>

それはうまく機能し、今日は春の依存関係を下に移動して、関連するジャージが一緒になるようにします。しかし、その後、私はそれを動作させることができなくなり、私のJettyは不平を言います:

[ERROR] Failed to execute goal org.Eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run (default-cli) on project mtest: Execution default-cli of goal org.Eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run failed: A required class was missing while executing org.Eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run: org/Apache/commons/logging/LogFactory

それは本当に紛らわしいので、依存関係の順序について心配する必要がありますか?正しい順序を知るにはどうすればよいですか?

48
Elderry

バージョン2.0.9以降では、Mavenが推移的な依存関係をどのように解決するかにより、依存関係の順序doesは重要です。 ドキュメント からの抜粋:

(...)これにより、アーティファクトの複数のバージョンが検出されたときに使用される依存関係のバージョンが決まります。 (...)プロジェクトのPOMで明示的に宣言することで、いつでもバージョンを保証できます。 (...)Maven 2.0.9以降では、宣言の順番が重要です:最初の宣言が勝ちます

74
kryger

他の回答(宣言の順序が推移的な依存関係のMavenの依存関係の調停に影響することを述べています)を展開するには、使用できるいくつかのツールがあります。

  • mvn dependency:tree [-Dscope=[runtime|test]]は、選択したスコープで使用可能な依存関係を示します。 詳細はこちらを参照
  • mvn dependency:build-classpathは、クラスパスで使用可能な依存関係の順序を示します(2つ以上のクラスパスエントリが同じクラスを持っている場合、早い方が優先されます)。 詳細はこちらを参照

私はあなたの状況についてあまり知りませんが、多くの場合、コンパイル/実行時に間違ったバージョンの1つ以上のjarを使用することになります。 問題のライブラリの独自のバージョンを宣言するか、バージョンをロックダウンする with <dependencyManagement>はここのオプションです。

ここで他の質問に答えます-依存関係を宣言するときに正しい順序がどのようにわかるのですか?

私の提案-正しい宣言順序は、あなたが望む依存関係のバージョンをあなたが望む順序で取得するものです。上記のツールを使用して依存関係を確認し、必要に応じて宣言された順序を調整します。

ほとんどのjarにはばらばらの名前のクラスが含まれているため、通常、jarがクラスパスに表示される正確な順序はそれほど重要ではありません。私が気づいた唯一の例外は、 SLF4Jの一部のjar です。これは、置き換えることを意図している他のロガーライブラリからクラスを意図的にシャドウします。

16
Kyle Krull