1. ホーム
  2. java

[解決済み] Gradleを使用しているときに、推移的依存関係のすべてのインスタンスを除外するにはどうすればよいですか?

2022-03-05 13:02:14

質問

私のgradleプロジェクトでは application プラグインを使用して jar ファイルをビルドします。実行時の依存関係の一部として org.slf4j:slf4j-log4j12 . (これは少なくとも5つか6つの他の推移的依存関係で下位推移的依存関係として参照されています。このプロジェクトはspringとhadoopを使っているので、キッチンシンク以外のすべてが引き込まれています... いや待てよ... それもある)... ).

をグローバルに除外したいのですが slf4j-log4j12 jar をビルドした jar から削除します。そこで、こんなことをやってみました。

configurations {
  runtime.exclude group: "org.slf4j", name: "slf4j-log4j12"
}

しかし、これでは すべて org.slf4j を含むアーティファクト slf4j-api . デバッグモードで実行すると、次のような行が表示されます。

org.slf4j#slf4j-api is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime).
org.slf4j#slf4j-simple is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime).
org.slf4j#slf4j-log4j12 is excluded from org.apache.hadoop:hadoop-common:2.2.0(runtime).

のソースをいちいち調べる必要はない。 slf4j-log4j12 の推移的依存関係、そして個々の compile foo { exclude slf4j... } の文は、私の dependencies ブロックを作成します。

更新しました。

こんなこともやってみました。

configurations {
  runtime.exclude name: "slf4j-log4j12"
}

を除外することになります。 すべて をビルドから削除します。あたかも group: "*" .

アップデート2

Gradleのバージョン1.10を使用しています。

どのように解決するのですか?

ああ、以下のようにするとうまくいき、私の望むとおりになります。

configurations {
  runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
}

のようです。 除外ルール は2つの属性しか持っていません。 groupmodule . しかし、上記の構文は、任意のプロパティを述語として指定することを妨げるものではありません。個々の依存関係から除外しようとする場合、任意のプロパティを指定することはできません。例えば、これは失敗します。

dependencies {
  compile ('org.springframework.data:spring-data-hadoop-core:2.0.0.M4-hadoop22') {
    exclude group: "org.slf4j", name: "slf4j-log4j12"
  }
}

No such property: name for class: org.gradle.api.internal.artifacts.DefaultExcludeRule

そのため、依存関係の指定は group:name: で除外を指定することはできません。 name: !?!

おそらく別の質問だと思いますが、何 まさに モジュール ということでしょうか?MavenのgroupId:artifactId:versionの概念は理解できますが、Gradleではgroup:name:versionに変換されると理解しています。しかし、その後、特定のMavenアーティファクトがどのモジュール(gradleの言葉で)に属しているかを知るにはどうすればよいですか?