75

私は通常、<dependencyManagement>セクションをに入れparent-project/pom.xmlます。このセクションには、次のような(つまり、要素<dependencyManagement>なしの)子モジュールのすべての依存関係の宣言とバージョンが含まれています。<scope>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
    </dependency>
  </dependencies> 
</dependencyManagement>

すべての子モジュール(つまり、moduleX / pom.xml)には、次のものがあります。

  <dependencies>
    <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <scope>test</scope>
    </dependency>
  </dependencies> 

明らかに、この例では<scope>test</scope>、同じ依存関係に対して複数回繰り返しています(junitを必要とするすべての子モジュールで1回)。

私の質問は次のとおりです。宣言
に関するベストプラクティスは何ですか? 入れた方がいいですか? それとも、(この投稿のように)子モジュールのセクションに配置する方が良いですか?なぜ? この質問に対する決定的な答えはありますか? <scope>
<dependencyManagement>
<dependencies>

4

4 に答える 4

60

パーティーに少し遅れましたが、2セント追加します。

最近、デバッグが非常に難しい問題に遭遇しました。
複数のプロジェクト間の依存関係を管理するための親pomがあります。それらの間で共通のすべての依存関係を設定し、、、groupIdおよび最も一般的なartifactIdを含めました。 私の考えでは、スコープが最も一般的なものと一致する場合は、各プロジェクトの実際の依存関係セクションにスコープを含める必要はありません。 これらの依存関係の一部が推移的な依存関係として表示されたときに問題が発生しました。たとえば、次の場合:versionscope
scope

  • AはコンパイルスコープでBに依存します。
  • BはコンパイルスコープでCに依存します。
  • CはdependencyManagement親の提供に設定されています。

次に、AのCへの推移的な依存関係が提供されると判断されます。それが理にかなっているかどうかはよくわかりませんが、確かに混乱を招きます。

とにかく、面倒を省いscopeて、あなたのから除外してくださいdependencyManagement

于 2013-12-23T19:36:02.503 に答える
32

dependencyManagementすべてのプロジェクトサブモジュールの依存関係バージョンを定義するためにここにあります。このセクションの適切なスコープはimportBOMのみです。

スコープはセクションで定義する必要がありますdependencies

(特定の依存関係について、使用コンテキストを決定します。実行に必要な場合にのみ依存関係を含めることができます。たとえば、earは providedターゲットサーバーで検出されるため、Java-ee依存関係(スコープ)でパッケージ化されません。 。)

[編集]

最初のステートメントには例外があり、セクションのスコープprovidedはセクションのdependencyManagement定義されたスコープをオーバーライドしdependenciesます。スコープを強制するには、DependencyManagementを参照してください

于 2013-03-05T10:32:14.640 に答える
4

他の回答と同様に、ベストプラクティスは、依存関係管理からスコープを除外し、依存関係を定義するときに明示的に指定することです。異なるスコープで同じ依存関係の異なるバージョンが必要になることはまれです。たとえば、アプリのコンパイル時と実行時のバージョンが異なります。私が考えることができる唯一のケースは、明示的に実行することです。ユーザーが指定したバージョンではなくそのバージョンを使用する場合に備えて、ライブラリの異なるバージョンに対してテストします。

スコープをdependencyManagementで定義すると、そのバージョンの使用が定義されたスコープのみに制限されるため、他のスコープは依存関係のランダムバージョンを取得します。昨日、dependencyManagementでテストスコープを使用してjunit 4.12を定義したときにこれに遭遇しましたが、一般的なテストフレームワークモジュールはコンパイルスコープを使用してjunitを使用したため、代わりにバージョン4.8.2を選択しました。

于 2015-02-25T17:01:19.413 に答える
2

どのスコープでも、依存関係管理に単一の依存関係を追加してもメリットはありません。あなたが持っているのは複製だけです。バージョンを構成可能にする場合は、プロパティを追加して、依存関係で使用します。

<properties>
        <junit.version>4.10</junit.version> 
    ...
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
    </dependency>
</dependencies>

ただし、依存関係管理が優れている場合があります。たとえばboms、Java EE実装の特定のバージョンを使用する場合のように、アーティファクトのより大きなコレクションのバージョンを調整するために使用している場合です。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.bom</groupId>
            <artifactId>jboss-javaee-6.0-with-tools</artifactId>
            <version>${javaee6.with.tools.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
....
于 2013-03-05T10:30:06.960 に答える