jaxrs-api VS jsr311-api VS javax.ws.rs-api VS jersey-core VS jaxrs-ri
jaxrs-api VS jsr311-api VS javax.ws.rs-api VS jersey-core VS jaxrs-ri
我在谷歌上搜索了很多次,但仍然对以上各项的确切含义感到困惑。
这是我的理解:
- jaxrs-api:仅包含 api。没有实施。但是和JSR311有什么区别呢
- jsr311-api : JSR311 是规范请求。这意味着它应该是一个文档。为什么它是一个罐子?
- javax.ws.rs-api:是实现吗?
- jersey-core(/jersey client):是JSR311的一个实现。
我下载了每个 jar 并尝试反编译并查看其中的内容,但我只能在所有 jar 中找到接口而不是实现。
我在 maven shade 插件生成的重复警告的上下文中遇到了这些问题,需要正确理解以上内容以找出要排除哪些以及为什么。
我先进入问题
"JSR311 it is a specification request. Which means it is supposed to be a document. Why then is it a jar?"
除了最后一个 (jersey-core
),所有这些罐子都是 "specification" 个罐子。 JAX-RS(以及许多其他 Java)规范定义了实现者应为其实现指定行为的契约(或接口)。
所以基本上规范中指定的所有 类 都应该作为合同放在 jar 中。罐子的最终用户可以将它们用于合同。但没有实施。尽管规范 API jar 足以编译 一个完整的 JAX-RS 兼容应用程序,但您需要对 运行 应用程序进行实际实现。
例如,如果我们在类路径上有那些规范 API jar 之一,我们可以编写一个完整的 JAX-RS 应用程序并编译它,但是为了 运行 它,如果我们没有实际的实现,我们需要部署到具有该规范版本的实际实现的服务器,例如 JBoss 或 Glassfish
jaxrs-api - 这是规范的 RESTeasy's 包装。它不是官方规范 jar,但它确实遵守规范合同。 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 jar 中。请注意,在 Jersey 的早期版本中,他们实际上将 JAX-RS 规范 API 打包到这个 jar 中。直到后来 Jersey 才开始使用官方的 spec jar。
jaxrs-ri - 这是打包到一个 jar 中的完整 Jersey 2.x 实现。 "ri" 表示 参考实现 ,这就是 Jersey:JAX-RS 参考实现。如果您没有使用像 Maven 这样的依赖管理器,您可能只想使用这个单一的 jar,而不必使用 Jersey 附带的所有单独的 jar。
其他资源
- Java API for RESTful Services (JAX-RS) 阅读不同规格版本的详细信息。
- Complete implementation for RESTeasy distribution。如果 JAX-RS 2.x 实现,RESTeasy 3.x 行,JAX-RS 1.x 行
的 RESTeast 2.x/1.x id
- Complete distribution of Jersey implementation。您可以在页面顶部的 "Jersey JAX-RS 2.0 RI bundle" link 中找到 JAX-RS 2.x 实现。在底部 links 到 Jersey 1.x 行分布,它遵守 JAX-RS 1.x 规范。
另请注意,虽然不同的实现遵循规范,但每个实现都有自己的一组额外功能。要了解更多信息,您应该阅读不同实现的文档。三个最流行的实现是 Jersey, RESTeasy, and CXF
我在谷歌上搜索了很多次,但仍然对以上各项的确切含义感到困惑。
这是我的理解:
- jaxrs-api:仅包含 api。没有实施。但是和JSR311有什么区别呢
- jsr311-api : JSR311 是规范请求。这意味着它应该是一个文档。为什么它是一个罐子?
- javax.ws.rs-api:是实现吗?
- jersey-core(/jersey client):是JSR311的一个实现。
我下载了每个 jar 并尝试反编译并查看其中的内容,但我只能在所有 jar 中找到接口而不是实现。
我在 maven shade 插件生成的重复警告的上下文中遇到了这些问题,需要正确理解以上内容以找出要排除哪些以及为什么。
我先进入问题
"JSR311 it is a specification request. Which means it is supposed to be a document. Why then is it a jar?"
除了最后一个 (jersey-core
),所有这些罐子都是 "specification" 个罐子。 JAX-RS(以及许多其他 Java)规范定义了实现者应为其实现指定行为的契约(或接口)。
所以基本上规范中指定的所有 类 都应该作为合同放在 jar 中。罐子的最终用户可以将它们用于合同。但没有实施。尽管规范 API jar 足以编译 一个完整的 JAX-RS 兼容应用程序,但您需要对 运行 应用程序进行实际实现。
例如,如果我们在类路径上有那些规范 API jar 之一,我们可以编写一个完整的 JAX-RS 应用程序并编译它,但是为了 运行 它,如果我们没有实际的实现,我们需要部署到具有该规范版本的实际实现的服务器,例如 JBoss 或 Glassfish
jaxrs-api - 这是规范的 RESTeasy's 包装。它不是官方规范 jar,但它确实遵守规范合同。 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 jar 中。请注意,在 Jersey 的早期版本中,他们实际上将 JAX-RS 规范 API 打包到这个 jar 中。直到后来 Jersey 才开始使用官方的 spec jar。
jaxrs-ri - 这是打包到一个 jar 中的完整 Jersey 2.x 实现。 "ri" 表示 参考实现 ,这就是 Jersey:JAX-RS 参考实现。如果您没有使用像 Maven 这样的依赖管理器,您可能只想使用这个单一的 jar,而不必使用 Jersey 附带的所有单独的 jar。
其他资源
- Java API for RESTful Services (JAX-RS) 阅读不同规格版本的详细信息。
- Complete implementation for RESTeasy distribution。如果 JAX-RS 2.x 实现,RESTeasy 3.x 行,JAX-RS 1.x 行 的 RESTeast 2.x/1.x id
- Complete distribution of Jersey implementation。您可以在页面顶部的 "Jersey JAX-RS 2.0 RI bundle" link 中找到 JAX-RS 2.x 实现。在底部 links 到 Jersey 1.x 行分布,它遵守 JAX-RS 1.x 规范。
另请注意,虽然不同的实现遵循规范,但每个实现都有自己的一组额外功能。要了解更多信息,您应该阅读不同实现的文档。三个最流行的实现是 Jersey, RESTeasy, and CXF