Java 中包含的 JAX-WS 实现?

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

我正在尝试简化部署包。我知道Sun JDK包括Metro的副本(例如,请参阅此问题此问题),但由于某种原因,显然必须将此Metro副本替换为从玻璃鱼网站下载的副本。我试图了解是否有可能只使用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部分包含:

<servlet>
    <servlet-name>MyService</servlet-name>
    <servlet-class>
        com.sun.xml.ws.transport.http.servlet.WSServlet
    </servlet-class>              
</servlet>

当我从 WAR 中删除 webservices-* jars--Metro jars-时,Web 服务失败,并显示错误“Wrapper 找不到 servlet 类 com.sun.xml.ws.transport.http.servlet.WSServlet 或它所依赖的类”。这并不奇怪,因为我在Java 7 SE附带的jars中找不到该类。

那么,如果你必须下载Metro的另一个副本才能使这样的东西工作,那么说Java 7附带Metro意味着什么呢?是否可以在Tomcat中仅使用Java附带的jars来运行JAX-WS Web服务?


答案 1

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

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

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

这是一个很好的问题。答案是 - 否,因为类扩展 ,并实现和接口。这些接口和类都是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 发行版与它捆绑在一起,您不必额外安装任何东西)。否则,您将坚持使用终结点#发布机制。WSServletHttpServletWSServletContextListenerServletContextAttributeListenerServletContextListener

另请参阅:


答案 2

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

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

无论如何,Sun通常会在捆绑库中更改软件包名称,这样它们就不会与外部软件包发生冲突,因此,如果servlet存在(它不存在),它可能会被称为:

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

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

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

但是如果你使用一些外部的JAX-WS,你必须使用

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

谢谢太阳!!


推荐