我的Java Web应用程序中的ClassNotFoundException / NoClassDefFoundError
我使用Java开发一个Web应用程序。 当我将其部署到我的应用程序服务器(Jetty,Tomcat,JBoss,GlassFish等)时会引发错误。 我可以在堆栈跟踪中看到这个错误信息:
java.lang.ClassNotFoundException
要么
java.lang.NoClassDefFoundError
这是什么意思,我该如何解决?
这是什么意思?
首先,我们来看看java.lang.ClassNotFoundException
的含义:
在应用程序尝试使用以下命令通过其string名称加载类时抛出:
- 类
Class
的forName
方法。- 类
ClassLoader
的findSystemClass
方法。- 类
ClassLoader
的loadClass
方法。但没有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
了库, test
或system
,否则你不应该遇到这些问题。 如果设置为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。