从gradleApi()

时间:2019-01-29 15:36:52

标签: gradle

build.gradle中,我对gradleApi()有依赖性:

compile gradleApi()

但是,它添加了破坏我的构建的JAR(重复的SLF4J绑定)。如何从gradleApi()中排除某些特定的依赖关系(标准exclude似乎不起作用)?如果不可能,我还有其他解决方法吗?

1 个答案:

答案 0 :(得分:1)

问题:

猜猜您正在编写gradle插件,并且使用gradleApi()依赖项。 gradleApi()使用SLF4J内部实现,例如注释中提到的@Chriki。您自己的SFL4J实现将被忽略。

如果通过插件扩展中的传递依赖项注入SLF4J实现,也会出现此问题。您将收到一个警告表格SLF4J:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:....gradle/caches/../generated-gradle-jars/gradle-api-....jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/....gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-simple/1.7.25/8dacf9514f0c707cbbcdd6fd699e8940d42fb54e/slf4j-simple-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.gradle.internal.logging.slf4j.OutputEventListenerBackedLoggerContext]

在Gradle论坛上进行讨论:https://discuss.gradle.org/t/logging-in-gradle-plugin/31685/2

解决方案:

删除cusotm SLF4J实现

在最终解决方案中仅保留基于Gradle Api的记录器,以防止模块配置中出现任何可传递的SLF4J依赖性。

configurations {
  implementation.exclude group: 'org.slf4j' // will exclude all transitive dependencies for org.slf4j, or any other specific logger implementation
}

dependencies {
  // No org.slf4j dependencies here
}

我不得不信任concretepage.com,在那里我找到了有关如何排除配置依赖项的解释。

自定义Gradle日志记录

有关实际Gradle日志记录系统的更多信息,以及如何使用official documentation并将其扩展。