JAX-WS实现包含在Java中?

Ken*_*ter 16 java tomcat web-services java-metro-framework jax-ws

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

我正在尝试简化部署包.据我所知,太阳JDK包括地铁的复印件(请参阅这个问题这个为例),但出于某种原因,这显然是强制性的,同时一个从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
Run Code Online (Sandbox Code Playgroud)

web.xml 包含,部分:

<servlet>
    <servlet-name>MyService</servlet-name>
    <servlet-class>
        com.sun.xml.ws.transport.http.servlet.WSServlet
    </servlet-class>              
</servlet>
Run Code Online (Sandbox Code Playgroud)

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

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

Mil*_*kic 17

那么,说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#发布机制.

也可以看看:


gpe*_*che 16

捆绑的JAX-WS缺乏整合与servlet容器,因为它是打算用来提供内部独立的Java应用程序JAX-WS服务(WTF!?!?!?).

当然,可以考虑实现执行该集成的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 ....样式配置属性.

谢谢太阳!!