単一の依存関係の推移的な依存関係をすべて除外する


221

Maven2では、単一の推移的な依存関係を除外するには、次のようにする必要があります。

<dependency>
  <groupId>sample.group</groupId>
  <artifactId>sample-artifactB</artifactId>
  <version>1</version>
   <exclusions>
     <exclusion>
       <groupId>sample.group</groupId>
       <artifactId>sample-artifactAB</artifactId>
     </exclusion>
   </exclusions>
</dependency>

このアプローチの問題は、によって提供されるすべての推移的な依存関係に対してこれを行わなければならないことですsample-artifactB

ある種のワイルドカードを使用して、すべての推移的な依存関係を1つずつではなく一度に除外する方法はありますか?


ライブラリの最新バージョンを使用する必要がある場合もありますが、Spring 2.5.6などの他の依存関係には古いバージョンが含まれます。たとえば、struts2-spring-plugin(2.1.6)にはSpring 2.5.3が含まれます。このようなシナリオでは、バージョンを除外または上書きする必要があります。
Vinod Singh

1
Ivyを使用します。冗談だ。
ジェイクトロント

回答:


54

maven2の場合、あなたが説明する方法を実行する方法はありません。maven 3にはあります。Maven 3を使用している場合は、この質問の別の回答を参照してください

maven 2の場合、<exclusions>がある依存関係用に独自のカスタムpomを作成することをお勧めします。その依存関係を使用する必要があるプロジェクトの場合は、一般的なアーティファクトではなく、カスタムpomに依存関係を設定します。これにより、単一の<exclusion>ですべての推移的な依存関係を除外できるとは限りませんが、依存関係を1回記述するだけで済み、すべてのプロジェクトで不要で長い除外リストを維持する必要がありません。


12
除外を回避するために独自のpomを作成しないことをお勧めします。これにより、ビルドの移植性が大幅に低下し、理解度が低下します。
ブライアンフォックス

1
承認済みの過去のアンサーを見ない場合:jira.codehaus.org/browse/MNG-3832
Jakub Bochenski

@JakubBochenski私が与えた答えは、maven 2に固有のものです。これは、この質問にタグ付けされているものです(このコメントを書いたとき)。あなたのリンクはmaven 3にのみ関連します。それにもかかわらず、私は自分の回答をリンクに編集して、より高く投票された回答にリンクしています。
クジラ2015年

306

私のために機能したのは(Mavenの新しい機能かもしれません)、除外要素でワイルドカードを使用しているだけです。

2つのWARパッケージモジュールで参照される「アプリ」モジュールを含むマルチモジュールプロジェクトがあります。それらのWARパッケージモジュールの1つは、実際にはドメインクラスのみを必要とします(そして、まだそれらをアプリモジュールから分離していません)。私はこれがうまくいくことを発見しました:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>app</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

groupIdとArtifactIdの両方のワイルドカードは、通常、この依存関係を使用してモジュールに伝搬されるすべての依存関係を除外します。


9
グループとアーティファクトの*ワイルドカードはmaven 3で機能しているようです
nkr1pt

22
Maven 3がアスタリスクの使用について明示的に警告しているため、これがどのように機能していたかはわかりません。有効なIDパターンに一致します。[警告]これらの問題はビルドの安定性を脅かすため、修正することを強くお勧めします。[警告]このため、Mavenの将来のバージョンでは、このような不正なプロジェクトの構築がサポートされなくなる可能性があります。サポートされ、使用できるという証拠を提供していただけますか?そうでなければ、私はあなたのコメントを非常に誤解を招くものとみなします。
ᄂ 1111

7
Maven 3.0.4で問題なく動作しました。おかげでたくさん
Evgeny Goldin

1
maven 3.0.4->うまくいきませんでした。アスタリスクを使用する場合、またはすべての直接の依存関係を明示的に除外する場合、結果のjarファイルは大きく異なります。それは、私がmaven-assembly-pluginを使用して太いjarを作成しているという事実に関係している可能性があります。この場合、提案されたスロションは機能しません!
gilad hoch 2013

31
このメソッドは有効です。彼らは他の人がmaven 3.2.1で報告しているという警告を修正しました:issues.apache.org/jira/browse/MNG-3832
Ryan

32

私が便利だと思ったことが一つあります:

プロジェクトの親POMまたはインポート可能な依存関係管理POMのdependencyManagementセクションに除外を含む依存関係を配置する場合は、除外(またはバージョン)を繰り返す必要はありません。

たとえば、親POMが次の場合:

<dependencyManagement>
    <dependencies>
    ...         
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.1</version>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
     ....
  </dependencies>
</dependencyManagement>

次に、プロジェクトのモジュールは、依存関係を次のように宣言するだけです。

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

親POMのは、バージョンと除外の両方を指定します。私はこのテクニックをほぼすべてのプロジェクトに使用しており、多くの繰り返しを排除しています。


23

3年前、バージョン99が存在しないことを推奨しましたが、特にバージョン99がオフラインであるため、より良い方法を見つけました。

プロジェクトの親POMで、maven-enforcer-pluginを使用して、不要な依存関係がビルドに侵入した場合にビルドを失敗させます。これは、プラグインの禁止された依存関係ルールを使用して実行できます。

<plugin>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.0.1</version>
    <executions>
        <execution>
            <id>only-junit-dep-is-used</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <bannedDependencies>
                        <excludes>
                            <exclude>junit:junit</exclude>
                        </excludes>
                    </bannedDependencies>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

次に、不要な依存関係について警告が表示されたら、親POMの<dependencyManagement>セクションで除外します。

<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-test</artifactId>
    <version>2.1.8.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

このようにして、不要な依存関係が誤って表示されることはなく(単なる<exclusion>忘れやすいものとは異なりprovided)、コンパイル時にも(スコープとは異なり)使用できず、(バージョン99とは異なり)偽の依存関係はありません。 (バージョン99とは異なり)カスタムリポジトリなしで動作します。このアプローチは、アーティファクトのバージョン、分類子、スコープ、またはgroupId全体に基づいて機能します。詳細については、ドキュメントを参照してください。


少なくともMaven 3.1では<configuration>、コマンドラインからゴールを実行する場合は無視され、の直下に移動する必要があることに注意してください<plugin>
David Harkness、2014

私は厄介なMavenバグのように見えるものを見つけました-バージョン3.5.2。親の<dependencyManagement>セクションで依存関係を除外するサブモジュールを含むプロジェクトがあります。mvn dependency:treeその特定のプロジェクトでを実行しても、除外された依存関係はまったくありません。しかし、その依存関係をインポートするすべてのプロジェクト<exclusions>は、他のプロジェクトの親pomを尊重しません-除外されたプロジェクトは侵入します!!! <exclusions>各モジュールのpomに直接移動する必要がありました。
cbaldan

11

私は次の回避策を使用します。すべての適切な依存関係でアーティファクトを除外しようとするのではなく、依存関係をトップレベルで「提供」として描画します。たとえば、xml-apisの「どのバージョン」でも出荷されないようにするには、次のようにします。

    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>[1.0,]</version>
        <scope>provided</scope>
    </dependency>


6

これには回避策があります。依存関係のスコープをruntimeに設定すると、推移的な依存関係は除外されます。ただし、ランタイムの依存関係をパッケージ化する場合は、追加の処理を追加する必要があることに注意してください。

ランタイム依存関係をパッケージに含めるには、maven-dependency-pluginの特定のアーティファクトコピーゴールを使用できます。


1
これは、2レベルの推移的包含の一部を処理できないAndroid Dalvikコンパイラの問題を回避するのに役立ちましたが、の<scope>provided</scope>代わりに使用する必要がありました<scope>runtime</scope>
Garret Wilson、

6

アセンブリに含める依存関係のアーティファクトからすべての推移的な依存関係を除外する必要がある場合は、アセンブリプラグインの記述子でこれを指定できます。

<assembly>
    <id>myApp</id>
    <formats>
        <format>zip</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <useTransitiveDependencies>false</useTransitiveDependencies>
            <includes><include>*:struts2-spring-plugin:jar:2.1.6</include></includes>
        </dependencySet>
    </dependencySets>
</assembly>

3

Eclipseで開発する場合、POMエディター(詳細タブが有効)依存関係グラフで、プロジェクトから除外する依存関係を探し、次のことができます。

それを右クリック-> "Mavenアーティファクトを除外..."とEclipseが除外するため、libがリンクされている依存関係を調べる必要はありません。


これは、m2eclipseプラグインを使用している場合にのみ機能することに注意してください
Nicolas Mommaerts 2012

2

すべての推移的な依存関係を除外する理由は何ですか?

すべての依存関係から除外する必要がある特定のアーティファクト(commons-loggingなど)がある場合、バージョン99が存在しないというアプローチが役立つ場合があります。


アップデート2012:このアプローチは使用しないでください。使用Mavenの-執行・プラグインと除外を。バージョン99は偽の依存関係を生成し、バージョン99リポジトリはオフラインです(同様のミラーがありますが、永久にオンラインを維持するためにそれらに依存することはできません。MavenCentralのみを使用するのが最善です)。


1

同様の問題で、スコープを指定して、必要な依存関係を宣言しました。このアプローチでは、推移的な依存関係がフェッチされますが、パッケージフェーズには含まれません。また、メンテナンスの面でもこのソリューションが好きです。なぜなら、維持する必要のあるpom、またはクジラのソリューションのようなカスタムpomがないからです。コンテナに特定の依存関係を提供し、実行する必要があるだけです


-2

クラスパスで最新のmavenを使用します。重複したアーティファクトを削除し、最新のmavenアーティファクトを保持します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.