使用Metro 2.1在Tomcat 7.0.11上发生WSServlet ClassNotFoundException错误

时间:2011-05-18 08:20:23

标签: java web-services jax-ws java-metro-framework tomcat7

我正在尝试使用Metro 2.1在Windows Server 2008 R2上使用Tomcat 7.0.11创建一个简单的Web服务。我来自C#/ WCF背景,试图更好地了解Web服务的互操作性。我实际上是在跟随Martin Kalin的书“Java Web Services Up and Running”中的一个例子。我有以下内容:

CATALINA_HOME=c:\tomcat-7.0.11
我在catalina.properties文件中的

server.loader=c:/metro-2.1/bin/*.jar 

(请注意,我也尝试将此路径添加到common.loader)。

我已将以下METRO jar文件复制到CALALINA_HOME \ lib:

  

web服务-api.jar文件,   web服务,extra.jar,   web服务,额外api.jar文件,   高于webservices-rt.jar,   web服务-的tools.jar

和CALALINA_HOME \背书:

  

web服务-api.jar文件

(注意,我最初尝试使用metro-on-tomcat.xml ant文件,但似乎没有为tomcat 7更新。*)

我还将webservices-api.jar复制到JAVA_HOME \ jre \ lib \ endorsed

我已尝试将其他METRO罐子放在上述位置,但也没有帮助。

现在,Tomcat启动正常并初始化METRO ok,这是catalina日志文件中的相关部分:

  

信息:部署Web应用程序   目录ROOT 18-May-2011 08:00:55   com.sun.xml.ws.transport.http.servlet.WSServletContextListener   contextInitialized INFO:WSSERVLET12:   JAX-WS上下文侦听器初始化   18-May-2011 08:01:07   com.sun.xml.ws.server.MonitorBase   createRoot INFO:Metro监控   rootname成功设置为:   com.sun.metro:PP = /,类型= WSEndpoint,名称= -TempConvertImplService-TempConvertImplPort   18-May-2011 08:01:08   com.sun.xml.ws.transport.http.servlet.WSServletDelegate    信息:WSSERVLET14:JAX-WS   servlet初始化

因此,您认为Tomcat已经加载了所有METRO类。根据我收集的内容,WSServlet是JAX-WS 2.1的一部分,它作为METRO的一部分提供,因此应该已经加载。但是当我实际尝试浏览我的服务的WSDL时,我在localhost日志中得到以下内容:

  

SEVERE:为servlet分配异常   TempConvertWS   抛出java.lang.ClassNotFoundException:   com.sun.xml.ws.transport.http.WSServlet     在   org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)     在   org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)     在   org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)....   (堆栈跟踪的其余部分)

我的sun-jaxws.xml看起来像这样:

<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
  <endpoint
      name="TempConvertWS"
      implementation="TimeServer.TempConvertImpl"
      url-pattern="/tc"
    />
</endpoints>

我的web.xml文件中的相关部分是:

  <listener>
    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>TempConvertWS</servlet-name>
    <servlet-class>com.sun.xml.ws.transport.http.WSServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TempConvertWS</servlet-name>
    <url-pattern>/tc</url-pattern>
  </servlet-mapping>

有人可以看到为什么Tomcat在浏览服务时无法找到/加载WSServlet类吗?

1 个答案:

答案 0 :(得分:2)

使用Tomcat 6,我在catalina.properties中设置共享 .loader,并将webservices-api.jar添加到<catalina-home>\endorsed

这就像一个魅力。

出于开发和测试的目的,您可以将webservices-extra.jar,webservices-extra-api.jar,webservices-rt.jar,webservices-tools.jar放入<catalina-home>/lib 而不是使用shared.loader指令。我发现这也与Eclipse更兼容。

我将使用Tomcat 7测试它是否有任何不同。

*更新:同样的技巧适用于Tomcat 7.0.14

* Update2:很抱歉我没有立刻看到它,但我注意到在你的web.xml中,指定的<servlet-class>是错误的。它应该是com.sun.xml.ws.transport.http.servlet.WSServlet