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つずつではなく一度に除外する方法はありますか?
Maven2の場合、説明したことを実行する方法はありません。 Maven 3にはあります。 Maven 3を使用している場合は、 この質問に対する別の回答 をご覧ください。
Maven 2の場合、<exclusions>を持つ依存関係用に独自のカスタムPOMを作成することをお勧めします。その依存関係を使用する必要があるプロジェクトの場合、一般的なアーティファクトの代わりにカスタムpomに依存関係を設定します。必ずしも単一の<exclusion>ですべての推移的な依存関係を除外できるわけではありませんが、依存関係を1回記述するだけで済み、すべてのプロジェクトで不要な長い除外リストを維持する必要がありません。
私のために働いたのは(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の両方のワイルドカードは、通常この依存関係を使用してモジュールに伝搬するすべての依存関係を除外します。
私が便利だと思ったことが一つあります:
プロジェクトの親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で、バージョンと除外の両方を指定します。私はこの手法をほぼすべてのプロジェクトに使用し、多くの繰り返しを排除しています。
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全体に基づいて機能します- 詳細については、ドキュメント を参照してください。
次の回避策を使用します。すべての適切な依存関係でアーティファクトを除外しようとする代わりに、トップレベルで依存関係を「提供」として描画します。たとえば、xml-apis "whatever version"の出荷を回避するには:
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>[1.0,]</version>
<scope>provided</scope>
</dependency>
現在、一度に複数の推移的な依存関係を除外する方法はありませんが、Maven JIRAサイトでこれに関する機能要求があります。
アセンブリに含める予定の依存関係アーティファクトからすべての推移的な依存関係を除外する必要がある場合は、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>
これには回避策があります。依存関係のスコープをruntimeに設定すると、推移的な依存関係は除外されます。ただし、ランタイム依存関係をパッケージ化する場合は、追加の処理を追加する必要があることに注意してください。
パッケージにランタイム依存関係を含めるには、maven-dependency-pluginの 特定のアーティファクトのコピー目標 を使用できます。
Eclipseで開発する場合は、POMエディター(高度なタブが有効)で依存関係グラフを使用して、プロジェクトから除外する依存関係を探してから、次のことができます。
それを右クリック->「Mavenアーティファクトを除外...」を選択すると、libがリンクされている依存関係を調べる必要なく、Eclipseが除外を行います。
すべての推移的な依存関係を除外する理由は何ですか?
すべての依存関係から除外する必要がある特定のアーティファクト(commons-loggingなど)がある場合、 Version 99 Does Not Exist アプローチが役立つ場合があります。
2012の更新:このアプローチを使用しないでください。 maven-enforcer-plugin and excludes を使用します。バージョン99は偽の依存関係を生成し、バージョン99リポジトリはオフラインです( similar mirrors がありますが、永遠にオンラインを維持するためにそれらに依存することはできません。MavenCentralのみを使用するのが最善です)。
似たような問題で、提供されたスコープで目的の依存関係を宣言しました。このアプローチでは、推移的な依存関係が取得されますが、パッケージフェーズには含まれません。メンテナンスの観点からもこのソリューションが好きです。なぜなら、維持するために必要なPOMやWhaleyのソリューションのようなカスタムPOMはないからです。コンテナに特定の依存関係を提供するだけで完了です