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

Gad*_*dam 26 rest jax-rs jersey jsr jsr311

我已经google了很多,仍然感到困惑的是上面的每一个究竟是什么意思.

以下是我对它的理解:

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

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

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

Pau*_*tha 46

我首先要回答这个问题

"JSR311是一个规范请求.这意味着它应该是一个文档.为什么它是一个罐子?"

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

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

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


  • jaxrs-api - 这是RESTeasy对规范打包.它不是官方规格罐,但它确实遵守规范合同.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"意味着参考实现,这是泽西岛的:JAX-RS参考实现.如果您没有使用像Maven这样的依赖管理器,您可能只想使用这个jar而不必使用Jersey附带的所有单独的jar.

其他资源

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

  • 另请注意,如果您使用Maven,则很少需要明确依赖任何规范jar.无论你使用什么实现都会将它拉进去.如果你要部署到EE服务器,并且你想严格遵守规范(保持可移植性),那么你应该只需要javaee-api jar.另请注意,如果您使用的是2.x实现,并且类路径上有1.x jar,则可能会遇到NuSuchMethodErrors.主要的API版本不兼容. (3认同)
  • 请注意,从 2.1.2 开始,JAX-RS 2.x 行已移至“jakarta.ws.rs-api”。3.0.0 也已发布,并且不再将 Jersey 作为后备实现。 (2认同)