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


103

私のgradleプロジェクトはapplicationプラグインを使用してjarファイルを作成しています。実行時の推移的な依存関係の一部として、結局はを取得しorg.slf4j:slf4j-log4j12ます。(それは少なくとも5または6の他の推移的な依存関係のサブ推移的な依存関係として参照されます-このプロジェクトは春とhadoopを使用しているので、キッチンシンク以外のすべてが引き込まれています...待つ必要はありません... )。

作成したslf4j-log4j12jarから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を使用しています。


2
あなたはあなたの質問への答えを受け入れたいかもしれません。礼儀正しく、質問への回答に対する関心が
高まる

回答:


136

ああ、次の作品と私がしたいことを行います:

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

除外ルールにgroup、およびの2つの属性しかないようですmodule。ただし、上記の構文では、任意のプロパティを述語として指定できます。個々の依存関係から除外しようとすると、任意のプロパティを指定できません。たとえば、これは失敗します。

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-speakで)どのモジュールに属しているのかをどうやって知るのですか?


1
これは、Gradleフォーラムにとってより良い議論のようです。
superEb 2014


3
ああ、私はちょうどこの正確な問題に苦労しました。Gradleを使用して何かを実行すること、特に大規模プロジェクトでの競合を解決することは非常に難しいと思います。Gradleのdslに対するxsd検証で詳細なxmlを喜んで取り入れます
cjbooms

「name:」は「module:」である必要があり、u :)で機能します
GuyK

1
将来の私や他の人のために、すべての依存ライブラリ(Gradle 3.3)をwarパッケージから除外したいと思いました。そのため、それぞれをリストするのではなく、単にしましたconfigurations { runtime.exclude group: '*' }
user1070304 2017年

39

1つ以上のライブラリをグローバルに除外するには、build.gradleに以下を追加します

configurations.all {
   exclude group:"org.apache.geronimo.specs", module: "geronimo-servlet_2.5_spec"
   exclude group:"ch.qos.logback", module:"logback-core"
}

これで、excludeブロックには2つのプロパティグループモジュールがあります。Mavenの背景から来るあなたのそれらのために、グループが同じであるのgroupIdモジュールが同じであるたartifactId。例:com.mchange:c3p0:0.9.2.1を除外するには、次のブロックを除外する必要があります

exclude group:"com.mchange", module:"c3p0"

1
おかげで私は理解している、彼らはモジュールが名前を意味すると言ったかもしれない
Remario '22

29

あなたのアプローチは正しいです。(状況によっては、を使用することもできますconfigurations.all { exclude ... }。)これらの除外で実際に複数の依存関係が除外されている場合(使用していることに気付いたことはありません)、http://forums.gradle.orgでバグを報告してください。、理想的には再現可能な例を使用します。


1
configurations.all{}まさに私が探していたものです。投稿をありがとうピーター
pczeus

19

以下の例では除外します

春ブートスタータートムキャット

compile("org.springframework.boot:spring-boot-starter-web") {
     //by both name and group
     exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' 
}

5

私はスプリングブート1.5.10を使用していて、ログバックを除外しようとしましたが、上記の解決策はうまく機能しませんでした。代わりに構成を使用します

configurations.all {
    exclude group: "org.springframework.boot", module:"spring-boot-starter-logging"
}

3

@ berguiga-mohamed-amineが述べたことに加えて、ワイルドカードではモジュール引数に空の文字列を残す必要があることがわかりました。

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.