2

Netflix Feign と Glassfish Jersey の実装に依存するプロジェクトがあります。

Feign は JAX-RS (JSR 311) の 1.1 仕様を使用し、glassfish jersey 実装は 2.0 仕様を使用します。2.0 は下位互換性がありますが、Gradle の依存関係の名前が変更されています。

したがって、私のプロジェクトには 2 つの依存関係があります。

  • javax.ws.rs:jsr311-api:1.1.1
  • javax.ws.rs:javax-ws-rs-api:2.0.1

どちらも同じパッケージに同じクラスを実装していますが、1.x に従っているものと 2.x に従っているものがあります。

私の Java コードでは、クラス名とパッケージしか指摘できません。

名前は異なりますが、これは実際には同じパッケージであり、そのようにしてクラスパスで実装クラスのセットを1つだけ取得することを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 に答える