我会先回答这个问题
“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。
其他资源
另请注意,尽管不同的实现遵循规范,但每个实现都有自己的一组额外功能。要了解更多信息,您应该阅读不同实现的文档。三个最流行的实现是Jersey、RESTeasy和CXF