Gradle 升级到 Gradle 6 时的依赖性问题

Gradle Dependency Problem when Upgrading to Gradle 6

我有一个 gradle 项目,我依赖于 "hudson-core 3.3.3"

compile group: 'org.eclipse.hudson', name: 'hudson-core', version: '3.3.3'

这在使用 Gradle 5.6.2

时没有问题

当我升级到 Gradle 6.0.1 时,我收到以下错误:

Could not resolve org.eclipse.hudson:hudson-remoting:3.0.3.
 Required by:
     project : > org.eclipse.hudson:hudson-core:3.3.3
     project : > org.eclipse.hudson:hudson-core:3.3.3 > org.eclipse.hudson:hudson-cli:3.3.3
  > Could not resolve org.eclipse.hudson:hudson-remoting:3.0.3.
     > inconsistent module metadata found. Descriptor: org.eclipse.hudson:hudson-remoting:3.0.4-SNAPSHOT Errors: bad version: expected='3.0.3' found='3.0.4-SNAPSHOT'

存储库始终相同:

repositories {
mavenCentral()
maven {
    url 'http://repo.jenkins-ci.org/public/'
}

}

知道为什么会发生这个错误吗?

hudson-remoting 3.0.3pom.xml文件中,版本是<version>3.0.4-SNAPSHOT</version>

问题很清楚了。

我尝试使用旧的 Gradle 4.4.1,但我遇到了完全相同的问题。同样,Gradle 5.1.1 和您的版本 5.6.2

我敢肯定,如果您为 Gradle 5.6.2 清理人工制品缓存,它将不再起作用。

错误在存储库端。

正如@ToYonos所说,问题出在依赖本身。

不是完美的解决方案,但可以按照 Gradle's documentation (v6.7.1):

中的说明完成 2 种解决方法
  1. Exclude that transitive dependency,例如在当前 Gradle 版本中使用 implementation 而不是 compile:

    implementation('org.eclipse.hudson:hudson-core:3.3.3') { 
        exclude group: 'org.eclipse.hudson'
        exclude module: 'hudson-remoting'
    }
    
  2. Override that transitive dependency version:

    implementation('org.eclipse.hudson:hudson-remoting') {
        version {
            strictly '3.0.2' // As 3.0.3 is having the issue
        }
    }
    

另一种选择是定义一个仅下载 jar 的存储库:

repositories {
    mavenCentral() {
        name = "Download only jar repo"
        metadataSources { artifact() }
        content {
            // Use this repository only for org.eclipse.hudson:hudson-remoting
            includeVersion("org.eclipse.hudson", "hudson-remoting", "3.0.3")
        }
    }
    mavenCentral()
}

此外,由于未下载 pom,您必须手动将 hudson-remoting 依赖项添加到 build.gradle。但幸运的是,对于这种特殊情况,hudson-core 已经包含 hudson-remoting 需要的唯一依赖项 commons-codec:commons-codec:1.4,因此不需要。

注意:存储库的顺序很重要,尽管在这种情况下它会以任何一种方式工作。如果您不想在使用带过滤器的存储库时关心顺序,请检查 exclusive content filtering.