Gradle:通过版本分类器覆盖传递依赖
Gradle: Override transitive dependency by version classifier
我的项目中声明的依赖项之一对 'com.google.guava:guava:15.0'
具有传递依赖项。但是我部署在 WAS/Weblogic 上的应用程序由于已在 'com.google.guava:guava:15.0:cdi1.0'
中修复的 CDI 问题而无法运行。 (相同版本,但带有分类器)我需要告诉 gradle 在构建和打包期间使用这个 jar。我正在尝试弄清楚我们如何使用特定于 jar 的版本分类器来克服这种传递依赖性。
尝试了以下方法:
- 明确添加依赖项:
compile 'com.google.guava:guava:15.0:cdi1.0'
。但是两个罐子都包含在结果 WAR. 中
显式添加依赖并定义解析策略:
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:15.0:cdi1.0'
}
}
连这个都没用。
定义了一个解析策略来检查和更改版本。
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if (details.requested.group + ":" + details.requested.name == 'com.google.guava:guava') {
details.useVersion "15.0:cdi1.0"
//details.useTarget "com.google.guava:guava:15.0:cdi1.0"
}
}
}
连这个都没用。
需要您就如何解决此问题提出建议。
目前在涉及 resolutionStrategies 时尚未考虑分类器。在声明依赖项并显式添加 Guava cdi1.0
版本时,您的解决方法可能是排除传递性 Guava 库:
dependencies {
compile ("org.acme:someDependency:1.0"){
exclude group: 'com.google.guava', module: 'guava'
}
compile "com.google.guava:guava:15.0:cdi1.0"
}
如果其他 jar 指向相同的依赖项,这将不起作用。 Sureshot 排除依赖的方法
configurations {
all*.exclude group: 'com.google.guava', module:'guava-jdk5'
}
我遇到了一个更优雅的方法,它很简单:
compile ("com.google.guava:guava:15.0:cdi1.0") {
force = true
}
说明
为依赖项设置 force = true
告诉 gradle 在版本冲突的情况下使用指定的版本
Gradle 4.5.1 有函数DependencySubstitutions。这里有一个替换依赖的例子:
configurations.each {
c -> c.resolutionStrategy.dependencySubstitution {
all { DependencySubstitution dependency ->
if (dependency.requested.group == 'org.json') {
dependency.useTarget 'com.vaadin.external.google:android-json:0.0.20131108.vaadin1'
}
}
}
}
由于force = true
已弃用,相关解决方案是使用strictly(...)
版本,例如:
dependencies {
// no need to exclude transitive spring-data-relational from this dependency
implementation("org.springframework.data", "spring-data-r2dbc", "1.1.0.RC1")
implementation("org.springframework.data", "spring-data-relational").version {
strictly("2.0.0.RC1")
}
}
P.S。在 Gradle 6.3
上测试
implementation( group: 'commons-codec', name: 'commons-codec'){
version{
strictly "[1.15]"
}
}
这适用于 gradle 6.6.1
严格的文档link可以在这里找到https://docs.gradle.org/current/userguide/rich_versions.html#rich-version-constraints
试试这个:
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
// https://docs.gradle.org/current/userguide/resolution_rules.html
if (details.requested.group == 'com.google.guava' && details.requested.name == 'guava') {
details.useVersion '15.0:cdi1.0'
}
}
}
我的项目中声明的依赖项之一对 'com.google.guava:guava:15.0'
具有传递依赖项。但是我部署在 WAS/Weblogic 上的应用程序由于已在 'com.google.guava:guava:15.0:cdi1.0'
中修复的 CDI 问题而无法运行。 (相同版本,但带有分类器)我需要告诉 gradle 在构建和打包期间使用这个 jar。我正在尝试弄清楚我们如何使用特定于 jar 的版本分类器来克服这种传递依赖性。
尝试了以下方法:
- 明确添加依赖项:
compile 'com.google.guava:guava:15.0:cdi1.0'
。但是两个罐子都包含在结果 WAR. 中
显式添加依赖并定义解析策略:
configurations.all { resolutionStrategy { force 'com.google.guava:guava:15.0:cdi1.0' } }
连这个都没用。
定义了一个解析策略来检查和更改版本。
configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group + ":" + details.requested.name == 'com.google.guava:guava') { details.useVersion "15.0:cdi1.0" //details.useTarget "com.google.guava:guava:15.0:cdi1.0" } } }
连这个都没用。
需要您就如何解决此问题提出建议。
目前在涉及 resolutionStrategies 时尚未考虑分类器。在声明依赖项并显式添加 Guava cdi1.0
版本时,您的解决方法可能是排除传递性 Guava 库:
dependencies {
compile ("org.acme:someDependency:1.0"){
exclude group: 'com.google.guava', module: 'guava'
}
compile "com.google.guava:guava:15.0:cdi1.0"
}
如果其他 jar 指向相同的依赖项,这将不起作用。 Sureshot 排除依赖的方法
configurations {
all*.exclude group: 'com.google.guava', module:'guava-jdk5'
}
我遇到了一个更优雅的方法,它很简单:
compile ("com.google.guava:guava:15.0:cdi1.0") {
force = true
}
说明
为依赖项设置 force = true
告诉 gradle 在版本冲突的情况下使用指定的版本
Gradle 4.5.1 有函数DependencySubstitutions。这里有一个替换依赖的例子:
configurations.each {
c -> c.resolutionStrategy.dependencySubstitution {
all { DependencySubstitution dependency ->
if (dependency.requested.group == 'org.json') {
dependency.useTarget 'com.vaadin.external.google:android-json:0.0.20131108.vaadin1'
}
}
}
}
由于force = true
已弃用,相关解决方案是使用strictly(...)
版本,例如:
dependencies {
// no need to exclude transitive spring-data-relational from this dependency
implementation("org.springframework.data", "spring-data-r2dbc", "1.1.0.RC1")
implementation("org.springframework.data", "spring-data-relational").version {
strictly("2.0.0.RC1")
}
}
P.S。在 Gradle 6.3
上测试implementation( group: 'commons-codec', name: 'commons-codec'){
version{
strictly "[1.15]"
}
}
这适用于 gradle 6.6.1
严格的文档link可以在这里找到https://docs.gradle.org/current/userguide/rich_versions.html#rich-version-constraints
试试这个:
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
// https://docs.gradle.org/current/userguide/resolution_rules.html
if (details.requested.group == 'com.google.guava' && details.requested.name == 'guava') {
details.useVersion '15.0:cdi1.0'
}
}
}