Mavenの依存関係をグローバルに除外する方法はありますか?


92

推移的な依存関係を、それに依存するすべての依存関係から除外することなく、含まれることから除外する「一般的な」方法を見つけようとしています。たとえば、slf4jを除外する場合は、次のようにします。

  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jmx</artifactId>
    <version>3.3.2.GA</version>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.4.0.GA</version>
    <type>jar</type>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>

これは、一部はpomファイルをクリーンアップするためであり、一部は除外された依存関係に依存する依存関係を追加し、除外するのを忘れる人々による将来の問題を回避するためです。

方法はありますか?


2
問題は解決しませんが、maven-enforcer-pluginには、不要な依存関係が侵入した場合にビルドに失敗する禁止された依存関係機能があります。ただし、手動で除外する必要があります:-/
dnault 2016年

別の答えはここにあります:stackoverflow.com/a/39979760/363573
Stephan

回答:


69

これは役に立ちますか?http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

「WARからavalon-frameworkを除外したい場合は、提供されたスコープでプロジェクトPOMに以下を追加します。これはすべての推移的な依存関係で機能し、一度指定することができます。

<dependencies>
  <dependency>
      <artifactId>avalon-framework</artifactId>
      <groupId>avalon-framework</groupId>
      <version>4.1.3</version>
      <scope>provided</scope>
  </dependency>
</dependencies>

これは、親POMで指定する場合でも機能し、プロジェクトがすべての子POMでこれを宣言する必要がなくなります。」


49
それはまだ部分的なハックにすぎません-依存関係はビルドアーティファクト内で終わることはありませんが、テスト中は引き続き利用できます。
Tuukka Mustonen 2012年

@TuukkaMustonenruntimeスコープの代わりにprovidedスコープはどうですか?
ステファン

avalon-framework 4.1.3+がプロジェクトの他の場所に含まれている場合はどうなりますか?ここで応答を参照してください:stackoverflow.com/a/39979760/363573
ステファン

私はもうMavenを使用していないので、他の回答をテストする立場にはありませんが、@ TuukkaMustonen
Joffer

18

空のjarを作成し、次の依存関係を作成しました。

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <scope>system</scope>
    <systemPath>${basedir}/src/lib/empty.jar</systemPath>
    <version>0</version>
</dependency>

これからはコンパイル/テストパスに空のjarがあるため、完全ではありません。しかし、それは単なる表面的なものです。


3
systemスコープは廃止されていますmaven.apache.org/guides/introduction/...
ジェイソン・ヤング

systemスコープの使用を回避するには、仮想Mavenリポジトリversion99.grons.nl(警告:HTTPのみ)または(commons-logging / log4jのみ)ここで「代替3)空のアーティファクト」を参照してください:slf4j.org/faq.html#exceptJCL
seanf

16

dnaultのコメントを拡張するには:

MavenEnforcerプラグインのBannedDependenciesルールを使用して、依存関係が確実に除外されるようにすることができます。それでも手動でそれらを除外する必要がありますが、誰かが誤って他の場所に依存関係を追加すると、ビルドは失敗します。

<dependencies>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jmx</artifactId>
    <version>3.3.2.GA</version>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
</dependencies>

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.4.1</version>
    <executions>
      <execution>
        <goals>
          <goal>enforce</goal>
        </goals>
        <configuration>
          <rules>
            <bannedDependencies>
              <excludes>
                <exclude>org.slf4j:slf4j-api</exclude>
              </excludes>
            </bannedDependencies>
          </rules>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>

また、オープン機能のリクエストがあります:MNG-1977グローバル依存関係の除外


2
あなたの答えとあなたが提供したリンクからの議論を読んだ後、ローカルとサーバーで使用されるMavenのバージョンが異なるために、不要なjarが時々fat jarに入ってくることに気付きました。厳密に強制されていない場合、パッケージングロジックはまったく異なるバージョンの依存関係を追加できます。同様の問題を解決するために、<goal> repackage </ goal>にspring-boot-maven-pluginconfiguration / excludes / excludeを使用しました。
アプロダン2018

10

念のため、Mavenの公式ドキュメントからの回答は次のとおりです。

POMレベルではなく、依存関係ごとに除外が行われる理由

これは主に、依存関係グラフが予測可能であることを確認し、継承効果が除外されるべきではない依存関係を除外しないようにするために行われます。最後の手段に到達し、除外を設定する必要がある場合は、どの依存関係がその不要な推移的な依存関係をもたらしているかを完全に確認する必要があります。

ビルドをより堅牢にしたい場合は、バージョン範囲を使用できます。これにより、新しいバージョンの依存関係がプロジェクトに干渉することがなくなります。

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>[1.4.2,)</version>
   <scope>provided</scope>
</dependency>

slf4j-apiバージョン> = 1.4.2は、構成されたクラスパスまたはコンテナーのいずれかから、実行時に提供(提供)されたと見なされます。

参考文献

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