jaxrs-api VS jsr311-api VS javax.ws.rs-api VS jersey-core VS jaxrs-ri

时间:2015-08-19 22:07:22

标签: rest jersey jax-rs jsr jsr311

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

以下是我对它的理解:

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

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

我在maven shade插件生成的重复警告的上下文中面对这些问题,并且需要正确理解上面的内容以找出要排除的内容和原因。

1 个答案:

答案 0 :(得分:41)

我首先回答问题

  

" JSR311这是一个规范请求。这意味着它应该是一份文件。那么为什么它是一个罐子?"

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

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

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

  • jaxrs-api - 这是规范的RESTeasy's打包。它不是官方规格罐,但它确实遵守规范合同。 RESTeasy将此jar用于整个规格线,即1.x - 电流。虽然jar确实会改变内部结构以符合不同的JAX-RS版本。

  • jsr311-api - 这是JAX-RS 1.x系列的官方规格jar。

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

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

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

其他资源

另请注意,虽然不同的实现符合规范,但每个实现都有自己的一组额外功能。要了解更多信息,您应该阅读不同实现的文档。最受欢迎的三个实现是JerseyRESTeasyCXF