是否可以防止Gradle添加排除的传递依赖项?

时间:2019-10-31 17:26:47

标签: java gradle

我有一个使用Gradle 5.6构建的Java库,其中抑制了某些传递依赖项

api('org.springframework.boot:spring-boot-starter-web') {
    exclude module: 'spring-boot-starter-logging'
    exclude module: 'spring-boot-starter-tomcat'
}

当我将其发布到Maven仓库时,我会得到POM.xml的相应部分

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <groupId>*</groupId>
            </exclusion>
            <exclusion>
                <artifactId>spring-boot-starter-logging</artifactId>
                <groupId>*</groupId>
            </exclusion>
        </exclusions>
    </dependency>
...
</dependencies>

但是当我将我的库作为依赖项添加时,也使用Gradle 5.6

dependencies {
    implementation 'my.group:my.lib:1.0.0'
}

我看到排除的依存关系(例如spring-boot-starter-tomcat)出现在我的compileClasspath配置中。有什么方法可以一劳永逸地排除它,还是应该在所有手动使用我的库的项目中使用它?

1 个答案:

答案 0 :(得分:3)

如文档所述(重点是我的):

  

排除特定的传递性依赖项不能保证它不会出现在给定配置的依赖项中。例如,一些没有任何排除规则的其他依赖项可能会引入完全相同的传递性依赖项。 为确保将传递依赖项从整个配置中排除,请使用按配置排除规则:Configuration.getExcludeRules()。实际上,在大多数情况下,配置每个依赖项排除的实际意图实际上是从整个配置(或类路径)中排除依赖项。

您可以为每个配置应用排除规则,而不是为每个配置指定排除规则:

// Kotlin DSL
configurations.all {
    exclude(mapOf("module" to "spring-boot-starter-logging"))
    exclude(mapOf("module" to "spring-boot-starter-tomcat"))
}