我有一个JAX-WS Web服务应用程序,它作为Tomcat 7的WAR文件部署。它使用了Metro库的最新版本,该版本包含在WAR文件中,并且运行良好。
我正在尝试简化部署程序包。据我所知,太阳JDK包括地铁的复印件(请参阅这个问题和这个为例),但出于某种原因,这显然是强制性的,同时一个从GlassFish网站下载,以取代地铁的这个副本。我试图了解是否可以仅使用Tomcat和JDK随附的Metro实现,否则,为什么不这样做。
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 部分包含:
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随附的jar中的任何地方找到该类。
那么,如果您必须下载另一份Metro副本才能进行此工作,那么说Metro 7附带Java 7意味着什么?是否可以仅使用Java附带的jar在Tomcat中运行JAX-WS Web服务?
捆绑的JAX-WS缺少与Servlet容器的集成,因为它 仅 用于在独立Java应用程序(WTF!?!?!?)中提供JAX-WS服务。
当然,人们可能会想到实现这种集成的servlet,因此您不必在WAR中包括Metro的另一个副本。但是,仅包含一个外部“完整”副本会更容易,它会使WAR显得but肿,但不应该对性能造成很大的影响。此外,通过这种方式,您可以控制使用的版本,避免卡在JRE中包含的版本中。
无论如何,Sun通常都会更改捆绑库中的软件包名称,以免它们与外部库冲突。因此,如果该servlet存在(不存在),则可能被称为:
com.sun.xml。 内部。 ws.transport.http.servlet.WSServlet
这非常令人讨厌,因为它们还以相同的方式更改了一些配置属性(例如,与超时相关的属性),因此,如果使用捆绑的JAX-WS,则必须使用
com.sun.xml。 内部。…样式配置属性,
但是,如果您使用一些外部JAX-WS,则必须使用
com.sun.xml ....样式配置属性。
谢谢太阳!