【问题标题】:Why is JAX-WS part of the JDK but JAX-RS is not?为什么 JAX-WS 是 JDK 的一部分,而 JAX-RS 不是?
【发布时间】:2016-12-07 15:56:27
【问题描述】:

在使用 Eclipse 时,我可以使用 JAX-WS 注释(例如 @WebService)而不包括任何外部依赖项,但我不能对 JAX-RS 注释(例如 @Path)做同样的事情。我看了一下this 的答案,我知道javax.ws.rs 不是JDK 的一部分。为什么 JAX-WS 是 JDK 的一部分而 JAX-RS 不是? 其次,如果我在 GlassFish 或 WildFly 服务器上部署 JAX-WS 注释应用程序,服务器是使用众所周知的 WebService 堆栈来运行应用程序(例如 Metro)还是它自己的实现?

【问题讨论】:

    标签: web-services jakarta-ee jax-rs jax-ws


    【解决方案1】:

    JAX-WS:用于 XML Web 服务的 Java API

    让我们回到 2006 年。Java SE 6 发布时引入了许多新功能。

    引用 Java SE 6 规范 (JSR 270),关于 Java SE 6 中引入的特性:

    Java SE 6 的功能集在很大程度上是由一组主题驱动的。

    主题描述了该版本的主要焦点。有些主题是相当抽象的指导原则;其他的则更具体,因为它们确定了特定的问题领域、重要的新功能集或特定的目标市场细分。

    [...]

    • XML 和 Web 服务: Java SE 5 版本,正如最初提议的那样,旨在包括一个完整的 Web 服务客户端堆栈。遗憾的是,这项工作未能在该版本发布之前及时完成,与此同时,XML 和 Web 服务对社区许多成员的重要性只会增加。

    [...]

    JAX-WS 2.0 规范的目标之一是准备 JAX-WS 以包含在 J2SE 的未来版本中(后来被重命名为 Java SE)。引用JSR 224

    • 包含在 J2SE 中:JAX-WS 2.0 将准备 JAX-WS 以包含在 J2SE 的未来版本中。应用程序可移植性是一项关键要求,JAX-WS 2.0 将定义机制来生成完全可移植的客户端。

    Java SE 6 包含 JAX-WS 2.0 组件,引入了在 Java SE 中创建基于 SOAP 的 Web 服务的可能性。引用 Oracle 的 this article

    Java 平台标准版 6 (Java SE 6) 最令人兴奋的新特性之一是支持 Java API for XML Web Services (JAX-WS) 2.0 版。 JAX-WS 2.0 是新重新架构的 Web 服务 API 堆栈的中心 [...]。

    尽管 JAX-WS 在 Java 平台企业版 5 (Java EE 5) 的开源世界中找到了它的主要家园,并且旨在取代 Java API for XML-Based RPC (JAX-RPC)在这样的环境中,您甚至可以在不接触企业服务器的情况下重用大部分功能 [...]

    您可以使用 JAX-WS 构建 Web 应用程序和 Web 服务,并结合新的基于 XML 的 Web 服务功能。 [...]

    当您运行应用程序时,Java SE 6 平台有一个小型 Web 应用程序服务器,它将发布 Web 服务。 [...]

    JAX-RS:用于 RESTful Web 服务的 Java API

    JAX-RS 于 2008 年出现。它最初由 JSR 311 定义,并包含在 Java EE 6 总括规范 (JSR 316) 中。

    JAX-RS 的第二个版本于 2013 年推出,由 JSR 339 定义,并包含在 Java EE 7 总体规范 (JSR 342) 下。

    JAX-RS 以 HTTP 为中心,JAX-RS 应用程序经常部署在 servlet 容器上。

    Java SE 7 (JSR 336) 和 Java SE 8 (JSR 337) 规范不包含 JAX-RS 组件。但是,JAX-RS 应用程序可以在 Java SE 环境中发布(使用RuntimeDelegate),并且 JAX-RS 实现也可以支持通过 JAX-WS 发布。

    在 Java SE 中包含 JAX-RS 也意味着包含该规范的实现。它使 Java SE 环境中的事情变得更加复杂,但在您的容器将为您提供实现的 Java EE 环境中完全可以接受。例如,GlassFish 为您提供 Jersey(参考实现),而 JBoss/WildFly 为您提供 RESTEasy。

    【讨论】:

      【解决方案2】:

      JAX-RS(用于 RESTful Web 服务的 Java API)实际上是一个定义 REST 支持的规范。 该规范是通过 Java 规范请求 (JSR) 311 定义的。

      简而言之,该规范定义了一个 API 和一些注解,所有兼容的 JAX-RS 实现都应该使用这些注解。因此,规范本身由创建 JAX-RS 实现(如 Jersey)的 JAX-RS 实现者和可以以相同方式使用任何兼容 JAX-RS 实现的程序员(最终用户)使用。

      为了使用 JAX-RS,您需要一个 JAX-RS 的实现。因此,如果 JDK 中不包含一个,则可以使用外部的。 JDK 中应该包含或不包含哪些实现的实际决定是复杂的,一些有趣的标准可能是实现成熟度和接受度,以及使用频率。 (一个很少使用的功能可以额外下载。)

      此答案使用此处提供的信息:

      http://www.vogella.com/tutorials/REST/article.html#restjersey

      对于您问题的第二部分:服务器使用捆绑的实现。例如 Glassfish 将 Metro 用于 JAX-WS,但这取决于服务器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-08
        • 2011-10-20
        • 2011-06-29
        • 2011-12-16
        • 1970-01-01
        • 2013-03-15
        • 2011-06-27
        • 1970-01-01
        相关资源
        最近更新 更多