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.3
的pom.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 种解决方法
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'
}
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.
我有一个 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.3
的pom.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 种解决方法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' }
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.