web-dev-qa-db-ja.com

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

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つずつではなく一度に除外する方法はありますか?

201
pbreault

Maven2の場合、説明したことを実行する方法はありません。 Maven 3にはあります。 Maven 3を使用している場合は、 この質問に対する別の回答 をご覧ください。

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

48
whaley

私のために働いたのは(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の両方のワイルドカードは、通常この依存関係を使用してモジュールに伝搬するすべての依存関係を除外します。

273
enricopulatzo

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

プロジェクトの親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で、バージョンと除外の両方を指定します。私はこの手法をほぼすべてのプロジェクトに使用し、多くの繰り返しを排除しています。

30
Joshua Davis

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全体に基づいて機能します- 詳細については、ドキュメント を参照してください。

22
Esko Luontola

次の回避策を使用します。すべての適切な依存関係でアーティファクトを除外しようとする代わりに、トップレベルで依存関係を「提供」として描画します。たとえば、xml-apis "whatever version"の出荷を回避するには:

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

現在、一度に複数の推移的な依存関係を除外する方法はありませんが、Maven JIRAサイトでこれに関する機能要求があります。

https://issues.Apache.org/jira/browse/MNG-2315

9
Peter

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

<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>
6
Superole

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

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

6
Rich Seller

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

それを右クリック->「Mavenアーティファクトを除外...」を選択すると、libがリンクされている依存関係を調べる必要なく、Eclipseが除外を行います。

3
Tib

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

すべての依存関係から除外する必要がある特定のアーティファクト(commons-loggingなど)がある場合、 Version 99 Does Not Exist アプローチが役立つ場合があります。


2012の更新:このアプローチを使用しないでください。 maven-enforcer-plugin and excludes を使用します。バージョン99は偽の依存関係を生成し、バージョン99リポジトリはオフラインです( similar mirrors がありますが、永遠にオンラインを維持するためにそれらに依存することはできません。MavenCentralのみを使用するのが最善です)。

3
Esko Luontola

似たような問題で、提供されたスコープで目的の依存関係を宣言しました。このアプローチでは、推移的な依存関係が取得されますが、パッケージフェーズには含まれません。メンテナンスの観点からもこのソリューションが好きです。なぜなら、維持するために必要なPOMやWhaleyのソリューションのようなカスタムPOMはないからです。コンテナに特定の依存関係を提供するだけで完了です

1
nkr1pt