一个类的Java ClassNotFoundException,但找到了另一个类

时间:2018-03-09 14:44:23

标签: java classnotfoundexception

我有一个Maven项目,它为通信接口提供低级API和基本功能。我有一些其他Maven项目都依赖于这个项目,并实现基于低级API的特定通信。由于这些是Maven项目,当我将更高级别的项目构建到.war文件中时,低级项目会自动作为.jar文件包含在lib文件夹中,以及所有其他依赖项。

我将这个项目部署到一个Tomcat 7,它已经托管了其他几个webapps,每个webapp都有自己的依赖项。它几乎立即产生了一个ClassNotFoundException,其中一个来自低级项目的类缺失了。这里有两件奇怪的事情:

  • 报告为缺失的类文件位于低级项目的.jar文件中
  • 找到同一项目中的另一个类文件,并在运行时成功使用

某些依赖冲突是否可能导致此问题?我不确定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正在成功加载。

2 个答案:

答案 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的依赖关系。