我可以告诉 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 依赖项名称已更改

因此我的项目中有两个依赖项:

两者都在相同的包中实现了相同的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 异常方法。