0

我正在使用 tomcat 7.0.39 的 websocket 功能,所以我必须将 catalina.jar 包含到我的类路径中。但是当我部署我的项目时,如果我将 jar 文件部署到 WEB-INF/lib 中,我会得到以下异常:

java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet

当 catalina.jar 未部署时,我得到 ClassNotFoundException:

java.lang.ClassNotFoundException: org.apache.catalina.websocket.MessageInbound

有人请帮助我。

堆栈跟踪:

java.lang.NoSuchMethodException:org.apache.catalina.deploy.WebXml addServlet
    在 org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:802)
    在 org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:201)
    在 org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1057)
    在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:604)
    在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1759)
    在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2915)
    在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:625)
    在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
    在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:819)
    在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:748)
    在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
    在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1208)
    在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:525)
    在 org.apache.tomcat.util.digester.Digester.parse(Digester.java:1543)
    在 org.apache.catalina.startup.ContextConfig.parseWebXml(ContextConfig.java:1694)
    在 org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1197)
    在 org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
    在 org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
    在 org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    在 org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
    在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5081)
    在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
    在 org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
    在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
    在 org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
    在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    在 org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
    在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    在 org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
    在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    在 org.apache.catalina.startup.Catalina.start(Catalina.java:620)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    在 java.lang.reflect.Method.invoke(Method.java:616)
    在 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
    在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)
4

2 回答 2

1

7.0.x 中的 Web 套接字支持是实验性的(很快就会被弃用,并被 Tomcat 8 中的 JSR 356 实现的端口所取代)。

这样做的一个副作用是 API 可以并且确实在点版本之间发生变化。因此,您必须从您打算部署的 Tomcat 版本重新编译 Tomcat JAR 代码。您看到的错误表明版本不匹配。

无需在 Web 应用程序中打包任何 Tomcat JAR。

于 2013-05-05T15:09:28.197 回答
0

你真的需要把 catalina.jar 放在你的类路径中吗?Catalina.jar 应该已经存在于 tomcat/lib 目录中。Tomcat 类加载器将从其自己的 lib 目录加载 jar,因此它是父类加载器,因此不会选择您的类路径或应用程序 catalina.jar。希望您能够使用此信息解决您的问题。

您收到 NoSuchMethodDefinition 错误,这意味着您用于编译的 jar 具有该方法,但加载执行的 jar 没有该方法定义。检查是否将 tomcat/lib 中的 catalina.jar 替换为您用于编译代码的 jar。

于 2013-05-05T12:57:14.447 回答