JAX-WS实现包含在Java中?

我有一个JAX-WS Web服务应用程序,它作为Tomcat 7的WAR文件进行部署。它使用最新版本的Metro库,我将其包含在WAR文件中,并且工作正常。

我正在尝试简化部署包。 据我所知,Sun JDK包含Metro的副本(例如,请参阅此问题和此问题 ),但出于某种原因,显然必须将此副本的地铁替换为从glassfish网站下载的地铁。 我试图了解是否有可能只使用Tomcat和JDK附带的城域网实现,或者如果不是为什么不这样做。

WAR内容如下(删除了类文件):

META-INF/MANIFEST.MF WEB-INF/classes/ WEB-INF/classes/com/[et cetera] WEB-INF/ibm-web-ext.xml WEB-INF/lib/ WEB-INF/lib/stax-api.jar WEB-INF/lib/webservices-api.jar WEB-INF/lib/webservices-extra-api.jar WEB-INF/lib/webservices-extra.jar WEB-INF/lib/webservices-rt.jar WEB-INF/lib/webservices-tools.jar WEB-INF/sun-jaxws.xml WEB-INF/web.xml wsdl/ wsdl/MyService.wsdl 

web.xml部分包含:

  MyService  com.sun.xml.ws.transport.http.servlet.WSServlet   

当我从WAR中删除webservices- * jars(Metro jar)时,Web服务失败并显示错误“Wrapper找不到servlet类com.sun.xml.ws.transport.http.servlet.WSServlet或类这取决于”。 这并不奇怪,因为我无法在Java 7 SE附带的jar子里找到该类。

那么,如果你必须下载另一份Metro来制作像这样的工作,那么说Java 7附带Metro是什么意思呢? 是否可以仅使用Java附带的jar来在Tomcat中运行JAX-WS Web服务?

捆绑的JAX-WS缺乏与servlet容器的集成,因为它只用于在独立的Java应用程序(WTF!?!?!?)中提供JAX-WS服务。

当然,可以考虑实现执行该集成的servlet,因此您不必在WAR中包含另一个Metro副本。 但是只包含一个外部的“完整”副本更容易,它会使WAR膨胀,但不应该有很大的性能损失。 此外,通过这种方式,您可以控制使用的版本,避免陷入JRE中包含的版本。

无论如何,Sun通常会更改捆绑库中的包名,这样它们就不会与外部库冲突。因此,如果servlet存在(它没有),它可能会被调用:

了com.sun.xml。 内部。 ws.transport.http.servlet.WSServlet

这非常烦人,因为它们也以相同的方式更改了一些配置属性(例如:超时相关的),因此如果您使用捆绑的JAX-WS,则必须使用

了com.sun.xml。 内部。 …样式配置属性,

但如果您使用一些外部JAX-WS,则必须使用

com.sun.xml ….样式配置属性。

谢谢太阳!!

那么,说Java 7附带Metro是什么意思?

这不完全正确。 JDK6 +包括JAX-WS RI(参考实现),Metro是它的超集。 换句话说,Metro = JAX-WS RI + WSIT。

是否可以仅使用Java附带的jar来在Tomcat中运行JAX-WS Web服务?

这是一个很好的问题。 答案是 – 不,因为WSServlet类扩展了HttpServlet ,而WSServletContextListener实现了ServletContextAttributeListenerServletContextListener接口。 这些接口和类都是Java EE的一部分,而不是Java SE – 因此不包含在JDK / JRE中。 Sun / Oracle决定不混用Java SE和Java EE,这是可以理解的,即使这意味着这些类实际上已经从JDK / JRE附带的JAX-WS RI版本中取出。 因此,您必须安装JAX-WS依赖项才能在Tomcat上使用基于JAX-WS的Web服务,因为Tomcat没有附带它(另一方面,如果您选择Glassfish,您会发现完整的Metro与它捆绑在一起的发行版,您不必另外安装任何东西)。 否则,您将无法使用Endpoint#发布机制。

也可以看看:

  • JRE 6中的WSServletContextListener和WSServlet

这是一个古老的问题,但如果有人还在寻找答案。 从JDK 1.7开始,我没有必要包含jaxws jar(我正精确地使用1.7.0_45)。 使用此http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/链接构建示例Web服务并跳过步骤5并且一切正常。 我的目标是Tomcat版本7.0.47,整个项目是使用Maven构建的,具有jaxws-rt jars的默认范围(即编译)。