我有一个Maven项目,它为通信接口提供低级API和基本功能。我有一些其他Maven项目都依赖于这个项目,并实现基于低级API的特定通信。由于这些是Maven项目,当我将更高级别的项目构建到.war文件中时,低级项目会自动作为.jar文件包含在lib文件夹中,以及所有其他依赖项。
我将这个项目部署到一个Tomcat 7,它已经托管了其他几个webapps,每个webapp都有自己的依赖项。它几乎立即产生了一个ClassNotFoundException,其中一个来自低级项目的类缺失了。这里有两件奇怪的事情:
某些依赖冲突是否可能导致此问题?我不确定Tomcat的类路径是如何工作的,但据我所知,它包括Tomcat的lib文件夹和所有webapps的lib文件夹,按某种顺序。这个低级项目需要许多依赖项,如commons-io,httpclient,log4j等。所有这些jar都存在于我的webapp的lib文件夹中,但是这些jar中的一些在Tomcat中有不同的版本。 lib项目(例如httpcore-4.3.2.jar在我的webapp中,而httpcore-4.0.jar在Tomcat的lib文件夹中)。我无法找到解释,但有些人提到这种情况可能会导致这种情况。我之前从未遇到过这个问题,由于这种jar冲突,我总是遇到java.lang.VerifyError(有时候会遇到ClassNotFoundException,但在这些情况下,其中一个依赖jar文件实际上缺少该类)。
这种jar冲突是否可能导致使用这些jar的类根本没有加载?我觉得这很奇怪。
更新
抱歉,我忘记了堆栈跟踪。这是打开应用程序时在浏览器中看到的内容:
Mar 09, 2018 2:30:48 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [hu.tsm.ccm.aif.mobilegateway.routes.init] in context with path [/AIFMobileGateway] threw exception [Servlet execution threw an exception] with root cause
java.lang.NoClassDefFoundError: hu.tsm.ccm.vxmlgateway.vxml.AbstractVxmlWalker
at hu.tsm.ccm.aif.mobilegateway.responses.InitResponse.<init>(InitResponse.java:47)
at hu.tsm.ccm.aif.mobilegateway.routes.init.doGet(init.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
这个hu.tsm.ccm.vxmlgateway.vxml.AbstractVxmlWalker类存在于webapp的lib文件夹中的jar文件中的类路径中。这个jar中的另一个类,即hu.tsm.ccm.vxmlgateway.api.Version正在成功加载。
答案 0 :(得分:0)
似乎问题与Tomcat启动期间的jar文件扫描有关。 Tomcat启动花了20分钟,我怀疑这是由于jar扫描,所以我将所有jar文件添加到catalina.properties文件中的tomcat.util.scan.DefaultJarScanner.jarsToSkip属性中。在这个Tomcat开始只有2分钟后,突然,没有任何其他更改,我的应用程序正常工作。
答案 1 :(得分:0)
异常java.lang.NoClassDefFoundError
表示在import
中用作导入(AbstractVxmlWalker
表达式)的类路径中缺少某些类。类路径中不存在AbstractVxmlWalker
的依赖关系。