我可以告诉 gradle 两个不同的依赖模块实际上是相同的,并让它选择版本最高的那个吗?
Can I tell gradle that two different dependency modules are actually the same and make it pick the one with highest version?
我有一个依赖于 Netflix Feign 和 Glassfish Jersey 实施的项目。
Feign 使用 JAX-RS (JSR 311) 的 1.1 规范,而 glassfish jersey 实现使用 2.0 规范。 2.0 是向后兼容的,但是 Gradle 依赖项名称已更改。
因此我的项目中有两个依赖项:
- javax.ws.rs:jsr311-api:1.1.1
- javax.ws.rs:javax-ws-rs-api:2.0.1
两者都在相同的包中实现了相同的classes,但是根据1.x和一个根据 2.x
在我的Java代码中,我只能指出class名称和包。
我可以告诉 Gradle 这实际上是同一个包,尽管名称不同,这样只能在 class 路径中获得一组实现 classes 吗?
现在 JVM 和编译器选择 classes 的哪个版本是随机的。有时不编译,有时编译但不编译 运行 (MethodNotFoundException).
我不确定这是最好的方法,但它有效:
configurations.all {
resolutionStrategy.dependencySubstitution {
all { DependencySubstitution d ->
if (d.requested instanceof ModuleComponentSelector && d.requested.name == 'jsr311-api') {
d.useTarget group: d.requested.group, name: 'javax-ws-rs-api', version: d.requested.version
}
}
}
}
更新:
可以使用 nebula.resolution-rules 插件和这样的配置以另一种方式做到这一点:
替换-jsr.json
{
"replace" : [
{
"module" : "javax.ws.rs:jsr311-api",
"with" : "javax.ws.rs:javax-ws-rs-api",
"reason" : "The JSR spec jar maven coordinates changed for 2.0 and later",
"author" : "Andreas Lundgren",
"date" : "2016-08-08T00:00:00.000Z"
}
],
"align": [],
"substitute": [],
"deny": [],
"reject": []
}
最后,我将其添加到我的 gradle 文件中,看起来不错:
configurations.all {
resolutionStrategy.dependencySubstitution {
substitute module('javax.ws.rs:jsr311-api') with module('javax.ws.rs:javax.ws.rs-api:2.0.1')
}
}
依赖关系树不再包含 javax.ws.rs:jsr311-api 依赖关系,也不再包含 javax.ws.rs.core.Application.getProperties(...) 的 MethodNotFound 异常方法。
我有一个依赖于 Netflix Feign 和 Glassfish Jersey 实施的项目。
Feign 使用 JAX-RS (JSR 311) 的 1.1 规范,而 glassfish jersey 实现使用 2.0 规范。 2.0 是向后兼容的,但是 Gradle 依赖项名称已更改。
因此我的项目中有两个依赖项:
- javax.ws.rs:jsr311-api:1.1.1
- javax.ws.rs:javax-ws-rs-api:2.0.1
两者都在相同的包中实现了相同的classes,但是根据1.x和一个根据 2.x
在我的Java代码中,我只能指出class名称和包。
我可以告诉 Gradle 这实际上是同一个包,尽管名称不同,这样只能在 class 路径中获得一组实现 classes 吗?
现在 JVM 和编译器选择 classes 的哪个版本是随机的。有时不编译,有时编译但不编译 运行 (MethodNotFoundException).
我不确定这是最好的方法,但它有效:
configurations.all {
resolutionStrategy.dependencySubstitution {
all { DependencySubstitution d ->
if (d.requested instanceof ModuleComponentSelector && d.requested.name == 'jsr311-api') {
d.useTarget group: d.requested.group, name: 'javax-ws-rs-api', version: d.requested.version
}
}
}
}
更新:
可以使用 nebula.resolution-rules 插件和这样的配置以另一种方式做到这一点:
替换-jsr.json
{
"replace" : [
{
"module" : "javax.ws.rs:jsr311-api",
"with" : "javax.ws.rs:javax-ws-rs-api",
"reason" : "The JSR spec jar maven coordinates changed for 2.0 and later",
"author" : "Andreas Lundgren",
"date" : "2016-08-08T00:00:00.000Z"
}
],
"align": [],
"substitute": [],
"deny": [],
"reject": []
}
最后,我将其添加到我的 gradle 文件中,看起来不错:
configurations.all {
resolutionStrategy.dependencySubstitution {
substitute module('javax.ws.rs:jsr311-api') with module('javax.ws.rs:javax.ws.rs-api:2.0.1')
}
}
依赖关系树不再包含 javax.ws.rs:jsr311-api 依赖关系,也不再包含 javax.ws.rs.core.Application.getProperties(...) 的 MethodNotFound 异常方法。