我的Java Web应用程序中的ClassNotFoundException / NoClassDefFoundError

我使用Java开发一个Web应用程序。 当我将其部署到我的应用程序服务器(Jetty,Tomcat,JBoss,GlassFish等)时会引发错误。 我可以在堆栈跟踪中看到这个错误信息:

java.lang.ClassNotFoundException 

要么

 java.lang.NoClassDefFoundError 

这是什么意思,我该如何解决?

这是什么意思?

首先,我们来看看java.lang.ClassNotFoundException的含义:

在应用程序尝试使用以下命令通过其string名称加载类时抛出:

  • ClassforName方法。
  • ClassLoaderfindSystemClass方法。
  • ClassLoaderloadClass方法。

但没有find具有指定名称的类的定义。

通常,当尝试以这种forms手动打开连接时会发生这种情况:

 String jdbcDriver = "...'; //name of your driver Class.forName(jdbcDriver); 

或者当您引用属于外部库的类时,很奇怪,当应用程序服务器尝试部署应用程序时,无法加载此类。

让我们看看java.lang.NoClassDefFoundError (强调我的)的含义:

如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分,或作为使用新expression式创build新实例的一部分),并且不能find该类的定义,则抛出该exception。

search到的类定义存在于当前正在执行的类被编译时,但定义不能再被find

最后一部分说明了这一点:类在编译时存在,即当我通过IDE编译应用程序时,但在运行时(即应用程序部署时)不可用。


我该如何解决?

在Java Web应用程序中,应用程序使用的所有第三方库都必须位于WEB-INF / lib文件夹中。 确保所有必要的库(jar子)都放在那里。 你可以很容易地检查这个:

 - <webapp folder> - WEB-INF - lib + jar1 + jar2 + ... - META-INF - <rest of your folders> 

这个问题通常出现在JDBC连通性jar(MySQL,Derby,MSSQL,Oracle等)或Web MVC框架库(如JSF或Spring MVC)上。

考虑到一些第三方库依赖于其他第三方库,所以你必须在WEB-INF / lib中添加所有这些库以使应用程序正常工作。 一个很好的例子就是RichFaces 4库, 你必须手动下载和添加外部库 。


注意Maven用户:除非你已经provided了库, testsystem ,否则你不应该遇到这些问题。 如果设置为provided ,您有责任在类path的某处添加库。 您可以在这里find更多关于依赖范围的信息: 依赖机制简介


如果库必须在应用程序服务器上部署的多个应用程序之间共享,例如两个应用程序的MySQL连接器,则还有另一种方法。 将这个库放置在服务器应用程序的公共库文件夹中,而不是部署两个带有自己的MySQL连接器库的war文件,这将使库位于所有已部署应用程序的类path中。

该文件夹因应用服务器而异。

  • Tomcat 7/8: <tomcat_home> / lib
  • JBoss 7 / Wildfly: <jboss_home> / standalone / lib

该类必须存在于WEB-INF / classes下,或者位于WEB-INF / lib下的.jar文件中。 确保它。

同样的问题发生在我身上。

可能有可能你的一个库正在使用一些不可用的内部类

在你的lib或maven依赖项pom.xml中。

这意味着你已经分析你的错误日志,并确定这些类,然后导入maven或lib文件夹中的所有依赖项。

我已经用相同的方法解决了这个错误。

因为我的一些库在内部使用activation.jar和json.jar。