为什么JAX-WS是JDK的一部分而JAX-RS不是?

时间:2016-08-02 10:31:15

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

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

2 个答案:

答案 0 :(得分:5)

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平台最激动人心的新功能之一Standard Edition 6(Java SE 6)支持XML Web Services for Java Web Services(JAX-WS)2.0版。 JAX-WS 2.0是用于Web服务的新重新架构的API堆栈的中心。

     

尽管JAX-WS在Java平台企业版5(Java EE 5)的开源世界中找到了它的主要内容,但它的目的是取代基于XML的RPC的Java API(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。

答案 1 :(得分:2)

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

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

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

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

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

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

相关问题