34

我已经用谷歌搜索了很多,仍然对上述每个内容的确切含义感到困惑。

以下是我对它的理解:

  • jaxrs-api:仅包含 api。没有执行。但它与 JSR311 有何不同
  • jsr311-api : JSR311 它是一个规范请求。这意味着它应该是一个文件。那为什么它是一个罐子呢?
  • javax.ws.rs-api:它是一个实现吗?
  • jersey-core(/jersey 客户端):是 JSR311 的实现。

我下载了每个 jar 并尝试反编译并查看其中的内容,但我只能在所有这些 jar 中找到接口而不是实现。

我在 maven shade 插件生成的重复警告的背景下面临这些问题,并且需要正确理解上述内容以确定要排除哪些以及为什么要排除。

4

1 回答 1

59

我会先回答这个问题

“JSR311这是一个规范请求。也就是说它应该是一个文档。为什么它是一个罐子?”

除了最后一个 ( jersey-core),所有这些罐子都是“规范”罐子。JAX-RS(以及许多其他 Java)规范定义了实现者应该为其实现指定行为的契约(或接口)。

所以基本上规范中指定的所有类都应该作为契约在 jar 中。罐子的最终用户可以将它们用于合同。但没有实施。尽管规范 API jar 足以编译一个完整的 JAX-RS 兼容应用程序,但您需要有一个实际的实现来运行应用程序。

例如,如果我们在类路径中有一个规范 API jar,我们可以编写一个完整的 JAX-RS 应用程序并编译它,但是为了运行它,如果我们没有实际的实现,我们需要部署到具有该规范版本的实际实现的服务器,例如 JBoss 或 Glassfish


  • jaxrs-api - 这是RESTeasy对规范的打包。它不是官方的规范 jar,但它确实遵守规范合同。RESTeasy 将这个 jar 用于整个规范行,即 1.x - current。尽管 jar 确实更改了内部结构以遵守不同的 JAX-RS 版本。

  • jsr311-api - 这是 JAX-RS 1.x 行的官方规范 jar。

  • javax.ws.rs-api - 这是 JAX-RS 2.x 行的官方规范 jar。

  • jersey-core - 这是规范的部分实现。其余的实现包含在其他 Jersey jars 中。请注意,在 Jersey 的早期版本中,他们实际上将 JAX-RS 规范 API 打包到这个 jar 中。直到后来,Jersey 才开始使用官方规格的罐子。

  • jaxrs-ri - 这是打包到一个 jar 中的完整 Jersey 2.x 实现。“ri”表示参考实现,这就是 Jersey 的含义:JAX-RS 参考实现。如果你没有使用像 Maven 这样的依赖管理器,你可能只想使用这个单一的 jar,而不必使用 Jersey 附带的所有单独的 jar。

其他资源

另请注意,尽管不同的实现遵循规范,但每个实现都有自己的一组额外功能。要了解更多信息,您应该阅读不同实现的文档。三个最流行的实现是JerseyRESTeasyCXF

于 2015-08-20T03:19:27.133 回答