Gradle 下载不需要的依赖项

Gradle downloads unrequired dependencies

我正在尝试使用 Gradle 我刚从 Maven Central 发布的依赖项进行下载:

repositories {
  mavenCentral()
}

dependencies {
  implementation 'io.github.iltotore:ec-client_2.13:1.0-fixed'
}

尝试构建时出现错误:

Could not find io.github.iltotore:core:1.0-fixed.
Required by:
    project : > io.github.iltotore:ec-client_2.13:1.0-fixed

但是 io.github.iltotore:core:1.0-fixed 不在 lib 的 pom 中,我的朋友可以毫无错误地使用它。

为了解决这个问题,我尝试了:

但这个问题仍然存在。

我使用 Gradle 6.5 和 Intellij IDEA 2020.1.2。

从Gradle 6.0开始,Maven Publish插件也会发布Gradle Module Metadata. The metadata has the file extension .module and you can see it in the repository here.

如果你打开pom file,你会注意到在顶部有一条评论说:

<!--  This module was also published with a richer model, Gradle metadata,   -->
<!--  which should be used instead. Do not delete the following line which   -->
<!--  is to indicate to Gradle or any Gradle module metadata file consumer   -->
<!--  that they should prefer consuming it instead.  -->
<!--  do_not_remove: published-with-gradle-metadata  -->

这指示 Gradle 使用元数据文件而不是 pom 文件。

如果你打开metadata file,你可以看到它确实依赖于不存在的模块:

"dependencies": [
    ...
    {
        "group": "io.github.iltotore",
        "module": "core",
        "version": {
            "requires": "1.0-fixed"
        }
    }
]

因为 core 在任何版本中都不存在,我认为这是一个错误。也许你正在定制 pom 文件,但没有为模块元数据做。

有几种方法可以解决此问题(以下所有代码段均适用于 Groovy DSL)。

一个。发布没有模块元数据的新版本

这样你就完全依赖于 pom 文件。您可以通过以下方式做到这一点:

tasks.withType(GenerateModuleMetadata) {
    enabled = false
}

请参阅 Gradle 用户指南中的 Understanding Gradle Module Metadata

乙。在消费项目的存储库中禁用模块元数据

请注意,这对 所有 模块都有效,而不仅仅是损坏的模块:

repositories {
    mavenCentral {
        metadataSources {
            mavenPom()
            artifact()
            ignoreGradleMetadataRedirection()
        }
    }
}

请参阅 Gradle 用户指南中的 Declaring repositories

摄氏度。针对此特定依赖项更正消费端的元数据

类似于:

dependencies {
    dependencies {
        components {
            // Fix wrong dependency in client_2.13
            withModule("io.github.iltotore:ec-client_2.13") {
                allVariants {
                    withDependencies {
                        removeAll { it.group == "io.github.iltotore" && it.name == "core" }
                    }
                }
            }
        }
    }

    implementation 'io.github.iltotore:ec-client_2.13:1.0-fixed'
}

请参阅 Gradle 用户指南中的 Fixing metadata with component metadata rules