gpt4 book ai didi

java - 使用 Metro 2.1 的 Tomcat 7.0.11 上的 WSServlet ClassNotFoundException 错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:06 25 4
gpt4 key购买 nike

我正在尝试使用 Metro 2.1 在 Windows Server 2008 R2 上使用 Tomcat 7.0.11 创建一个简单的网络服务。我来自 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\endorsed:

webservices-api.jar

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

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

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

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

INFO: Deploying web application directory ROOT 18-May-2011 08:00:55 com.sun.xml.ws.transport.http.servlet.WSServletContextListener contextInitialized INFO: WSSERVLET12: JAX-WS context listener initializing 18-May-2011 08:01:07 com.sun.xml.ws.server.MonitorBase createRoot INFO: Metro monitoring rootname successfully set to: com.sun.metro:pp=/,type=WSEndpoint,name=-TempConvertImplService-TempConvertImplPort 18-May-2011 08:01:08 com.sun.xml.ws.transport.http.servlet.WSServletDelegate INFO: WSSERVLET14: JAX-WS servlet initializing

因此您会认为 Tomcat 已经加载了所有 METRO 类。从我收集到的信息来看,WSServlet 是 JAX-WS 2.1 的一部分,它作为 METRO 的一部分提供,因此它应该已经加载。但是当我实际尝试浏览到我的服务的 WSDL 时,我在本地主机日志中得到以下信息:

SEVERE: Allocate exception for servlet TempConvertWS java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.WSServlet at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521) at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415).... (rest of stack trace)

我的 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 类?

最佳答案

对于 Tomcat 6,我在 catalina.properties 中设置了 shared.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

关于java - 使用 Metro 2.1 的 Tomcat 7.0.11 上的 WSServlet ClassNotFoundException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6041770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com