Gradle 6.0 的 Maven 和 Ivy 依赖项解析失败
Maven and Ivy dependency resolution fails with Gradle 6.0
我有一个工作项目依赖于对等组件生成的 Maven 工件,如下所示:
repositories {
ivy {
url "../cnf/local"
}
}
configurations {
ejbTools
}
dependencies {
ejbTools 'test:com.ibm.ws.ejbcontainer.fat_tools:1.+'
}
依赖项 test:com.ibm.ws.ejbcontainer.fat_tools:1.+
无法通过 Gradle 6.0 解析,出现以下错误:
> Task :com.ibm.ws.ejbcontainer.async_fat:addEJBTools FAILED
FAILURE: Build failed with an exception.
* Where:
Build file '/Users/aguibert/dev/git/open-liberty/dev/com.ibm.ws.ejbcontainer.async_fat/build.gradle' line: 32
* What went wrong:
Execution failed for task ':com.ibm.ws.ejbcontainer.async_fat:addEJBTools'.
> Could not resolve all files for configuration ':com.ibm.ws.ejbcontainer.async_fat:ejbTools'.
> Could not find any matches for test:com.ibm.ws.ejbcontainer.fat_tools:1.+ as no versions of test:com.ibm.ws.ejbcontainer.fat_tools are available.
Searched in the following locations:
- https://repo.maven.apache.org/maven2/test/com.ibm.ws.ejbcontainer.fat_tools/maven-metadata.xml
- http://public.dhe.ibm.com/ibmdl/export/pub/software/olrepo/test/com.ibm.ws.ejbcontainer.fat_tools/maven-metadata.xml
- file:/Users/aguibert/dev/git/open-liberty/dev/cnf/local/test/com.ibm.ws.ejbcontainer.fat_tools/
- file:/Users/aguibert/dev/git/open-liberty/dev/cnf/local/test/com.ibm.ws.ejbcontainer.fat_tools/1.0.33.201909241016/ivy-1.0.33.201909241016.xml
Required by:
project :com.ibm.ws.ejbcontainer.async_fat
上下文
目前我的项目正在使用 Gradle 5.5 并且可以使用 Java 8、11 或 12 构建。我也在尝试使用 Java 13,所以我我正在尝试升级到 Gradle 6.0.
通配符依赖项现在在 Gradle 中的工作方式似乎发生了一般行为变化(例如 com.foo:bar:1.+
)。
根据 this Gradle issue,Gradle 6.0 中的行为发生了重大变化。以前,Gradle 会自动检查工件元数据(例如 maven-metadata.xml
),但为了提高性能,Gradle 6.0 似乎不再默认执行此操作。
这个问题有 2 种可能的解决方案:
使用特定的依赖坐标而不是像 1.+
这样的通配符版本(这是 IMO 的最佳实践)
更新repositories.[maven|ivy].metadataSources
配置。在 Gradle 5.X 中,默认值是:
repositories {
maven {
url "http://repo.mycompany.com/repo"
metadataSources {
mavenPom()
artifact()
}
}
ivy {
url "http://repo.mycompany.com/repo"
metadataSources {
ivyDescriptor()
artifact()
}
}
}
但在 Gradle 6.0 中,它们现在是:
repositories {
maven {
url "http://repo.mycompany.com/repo"
metadataSources {
mavenPom()
}
}
ivy {
url "http://repo.mycompany.com/repo"
metadataSources {
ivyDescriptor()
}
}
}
因此,要恢复到以前的行为,请将 artifact()
配置添加到 repositores.[maven|ivy].metadataSources
配置块。
我有一个工作项目依赖于对等组件生成的 Maven 工件,如下所示:
repositories {
ivy {
url "../cnf/local"
}
}
configurations {
ejbTools
}
dependencies {
ejbTools 'test:com.ibm.ws.ejbcontainer.fat_tools:1.+'
}
依赖项 test:com.ibm.ws.ejbcontainer.fat_tools:1.+
无法通过 Gradle 6.0 解析,出现以下错误:
> Task :com.ibm.ws.ejbcontainer.async_fat:addEJBTools FAILED
FAILURE: Build failed with an exception.
* Where:
Build file '/Users/aguibert/dev/git/open-liberty/dev/com.ibm.ws.ejbcontainer.async_fat/build.gradle' line: 32
* What went wrong:
Execution failed for task ':com.ibm.ws.ejbcontainer.async_fat:addEJBTools'.
> Could not resolve all files for configuration ':com.ibm.ws.ejbcontainer.async_fat:ejbTools'.
> Could not find any matches for test:com.ibm.ws.ejbcontainer.fat_tools:1.+ as no versions of test:com.ibm.ws.ejbcontainer.fat_tools are available.
Searched in the following locations:
- https://repo.maven.apache.org/maven2/test/com.ibm.ws.ejbcontainer.fat_tools/maven-metadata.xml
- http://public.dhe.ibm.com/ibmdl/export/pub/software/olrepo/test/com.ibm.ws.ejbcontainer.fat_tools/maven-metadata.xml
- file:/Users/aguibert/dev/git/open-liberty/dev/cnf/local/test/com.ibm.ws.ejbcontainer.fat_tools/
- file:/Users/aguibert/dev/git/open-liberty/dev/cnf/local/test/com.ibm.ws.ejbcontainer.fat_tools/1.0.33.201909241016/ivy-1.0.33.201909241016.xml
Required by:
project :com.ibm.ws.ejbcontainer.async_fat
上下文
目前我的项目正在使用 Gradle 5.5 并且可以使用 Java 8、11 或 12 构建。我也在尝试使用 Java 13,所以我我正在尝试升级到 Gradle 6.0.
通配符依赖项现在在 Gradle 中的工作方式似乎发生了一般行为变化(例如 com.foo:bar:1.+
)。
根据 this Gradle issue,Gradle 6.0 中的行为发生了重大变化。以前,Gradle 会自动检查工件元数据(例如 maven-metadata.xml
),但为了提高性能,Gradle 6.0 似乎不再默认执行此操作。
这个问题有 2 种可能的解决方案:
使用特定的依赖坐标而不是像
1.+
这样的通配符版本(这是 IMO 的最佳实践)更新
repositories.[maven|ivy].metadataSources
配置。在 Gradle 5.X 中,默认值是:repositories { maven { url "http://repo.mycompany.com/repo" metadataSources { mavenPom() artifact() } } ivy { url "http://repo.mycompany.com/repo" metadataSources { ivyDescriptor() artifact() } } }
但在 Gradle 6.0 中,它们现在是:
repositories { maven { url "http://repo.mycompany.com/repo" metadataSources { mavenPom() } } ivy { url "http://repo.mycompany.com/repo" metadataSources { ivyDescriptor() } } }
因此,要恢复到以前的行为,请将
artifact()
配置添加到repositores.[maven|ivy].metadataSources
配置块。