2

我有一个依赖于 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

两者都在相同的包中实现相同的类,但一个根据 1.x,一个根据 2.x

在我的 Java 代码中,我只能指出类名和包。

我可以告诉 Gradle 这实际上是同一个包,尽管名称不同,并且只能在类路径中获得一组实现类吗?

现在,JVM 和编译器选择哪个版本的类是随机的。有时它不编译,有时它编译但不运行(MethodNotFoundException)。

4

2 回答 2

2

最后,我将它添加到我的 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-exception。

于 2016-08-08T14:32:48.457 回答
1

我不确定这是最好的方法,但它有效:

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": []
}
于 2016-08-01T12:03:54.723 回答