【问题标题】:WSServlet ClassNotFoundException error on Tomcat 7.0.11 using Metro 2.1使用 Metro 2.1 的 Tomcat 7.0.11 上的 WSServlet ClassNotFoundException 错误
【发布时间】:2011-05-18 08:20:23
【问题描述】:

我正在尝试使用 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:

webservices-api.jar, webservices-extra.jar, webservices-extra-api.jar, webservices-rt.jar, webservices-tools.jar

并到 CALALINA_HOME\认可:

webservices-api.jar

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

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

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

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

信息:部署 Web 应用程序 目录根 18-May-2011 08:00:55 com.sun.xml.ws.transport.http.servlet.WSServletContextListener 上下文初始化信息:WSSERVLET12: JAX-WS 上下文侦听器初始化 2011 年 5 月 18 日 08:01:07 com.sun.xml.ws.server.MonitorBase createRoot INFO:地铁监控 rootname 成功设置为: com.sun.metro:pp=/,type=WSEndpoint,name=-TempConvertImplService-TempConvertImplPort 2011 年 5 月 18 日 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 日志中得到以下信息:

严重:为 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 类吗?

【问题讨论】:

  • 它需要的是 jaxws-ri 库,我认为它们是 jaxws-api.jar, jaxws-rt.jar, jaxws-tools.jar, streambuffer.jar,仅举几例。确保他们在CATALINA_HOME/lib

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


【解决方案1】:

使用 Tomcat 6,我在 catalina.properties 中设置 shared.loader 并将 webservices-api.jar 添加到 &lt;catalina-home&gt;\endorsed

这就像一个魅力。

出于开发和测试目的,您可以将 webservices-extra.jar、webservices-extra-api.jar、webservices-rt.jar、webservices-tools.jar 放入&lt;catalina-home&gt;/lib 改为使用 shared.loader 指令。我发现这也与 Eclipse 更兼容。

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

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

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

【讨论】:

  • 你设法让它工作了吗?如果有,能否给出解决方案以供日后参考?
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 2012-09-25
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多