2013-03-05 14 views
39

通常<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> 

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

質問:<scope>宣言に関するベストプラクティスは何ですか? <dependencyManagement>に入れる方が良いですか?子モジュールの<dependencies>セクションに置く方がよいでしょうか(この記事のように)?なぜ ?この質問に明確な答えがありますか?

答えて

34

少し遅れていますが、私は2セントを追加します。私は最近、問題をデバッグするのが非常に難しかったです。私は複数のプロジェクト間の依存関係を管理するための親pomを持っています。私は、それらの間で共通のすべての依存関係を設定し、groupId、artifactId、バージョン、最も一般的なスコープを含めました。私が考えているのは、各プロジェクトの実際の依存関係セクションにスコープを含める必要がないということです。それは、の最も一般的なスコープに一致した場合です。これらの依存関係のいくつかが推移的な依存関係として現れたときに問題が発生しました。例えば、CがCに続いてAの推移依存親

のdependencyManagementに設けに設定されている

    • AコンパイルスコープでBに依存
    • Bは、コンパイルスコープでCに依存している場合提供されると決定される。それが意味をなさないかどうかは分かりませんが、確かに混乱しています。

      とにかく、手間を省き、スコープを依存関係管理から外してください。

    +3

    それは意味がありますが、よく説明されていません。http://maven.40175を参照してください。 .n5.nabble.com/DependencyManagement-to-force-scope-td112273.html、私は以下の私の答えを編集する – Gab

    2

    依存関係管理に単一の依存関係を追加することはできません。あなたが持っているのは複製だけです。あなたが設定可能なバージョンを持っているしたい場合は、プロパティを追加し、依存関係でそれを使用します。

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

    はしかし、依存関係の管理が輝くケースがあります - あなたはAのバージョンを編成するために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> 
    .... 
    
    +3

    artifactバージョンが定義されている唯一の場所は、dependencyManagement(1つの単一依存関係でも)です。私の意見では、この唯一の事実はそれを使用するのに十分です。同じバージョンID(たとえばスプリングモジュール)に常に含まれる複数の成果物があるため、プロパティを使用すると便利です。 – ben75

    +0

    dependencyManagementを使用するもう一つの理由は、依存関係の不要な推移依存を一元的に除外することです。 –

    +0

    バージョンのプロパティを使うもう一つの理由は、 'mvn versions:display-property-updates'を使って依存関係のバージョンの更新を素早くチェックできるようにするためです。' artifactId.version 'pattern –

    13

    dependencyManagementは、すべてのプロジェクトのサブモジュールの依存関係のバージョンを定義するだけで、ここで、このセクションの唯一の適切な範囲は、部品表のためimportです。

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

    (特定の依存関係については、使用コンテキストを決定します)実行に必要な場合のみ依存性を含めることができます。たとえば、耳はJava-ee依存性(スコープprovided)ターゲット・サーバー上でそれらを見つける。)

    [編集]

    最初の文は例外があり、スコープprovideddependencyManagementセクションでdependenciesのセクションで定義されたスコープを上書きします。 DependencyManagement to force scope

    +2

    "このセクションの唯一の関連スコープはimportです "スコープ' test'を 'dependendcyManagement'に置いた場合、それは意味がありませんか? – ben75

    +1

    いいえそれは効果があります – Gab

    +4

    実際に私は完全に正しいcfではないようです。 http://maven.40175.n5.nabble.com/DependencyManagement-to-force-scope-td112273.html 'dependencyManagement'スコープには興味があります – Gab

    2

    他の回答と同様に、スコープをdependencyManagementから除外し、依存関係を定義するときにスコープを明示的に指定することをお勧めします。まれに、異なるスコープで同じ依存関係の別のバージョンが必要な場合があります。たとえば、アプリケーションをコンパイルするときに1つのバージョンを、実行するときに別のバージョンを使用する場合があります。ユーザーが指定したバージョンの代わりにそのバージョンを使用する場合のライブラリの異なるバージョンに対するテスト。

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