我使用Java开发Web应用程序。当我将它部署到我的应用程序服务器(Jetty,Tomcat,JBoss,GlassFish等)时会抛出错误。我可以在stacktrace中看到此错误消息:
java.lang.ClassNotFoundException
或者
java.lang.NoClassDefFoundError
这是什么意思,我该如何解决?
答案 0 :(得分:3)
这是什么意思?
首先,让我们看看java.lang.ClassNotFoundException
:
当应用程序尝试使用以下命令通过其字符串名称加载类时抛出:
- 班级
forName
中的Class
方法。- 班级
findSystemClass
中的ClassLoader
方法。- 班级
loadClass
中的ClassLoader
方法。但是找不到具有指定名称的类的定义。
通常,尝试以此形式手动打开连接时会发生这种情况:
String jdbcDriver = "...'; //name of your driver
Class.forName(jdbcDriver);
或者,当您引用属于外部库的类并且奇怪地时,当应用程序服务器尝试部署应用程序时,无法加载此类。
让我们看看java.lang.NoClassDefFoundError
(强调我的)的含义:
如果Java虚拟机或
ClassLoader
实例尝试加载类的定义(作为普通方法调用的一部分或作为使用新表达式创建新实例的一部分)并且没有定义,则抛出可以找到班级。在编译当前正在执行的类时存在搜索的类定义,但无法再找到该定义。
最后一部分说明了一切:该类在编译时存在,即当我通过IDE编译应用程序时,但它在运行时不可用,即部署应用程序时。
我该如何解决?
在Java Web应用程序中,应用程序使用的所有第三方库都必须位于WEB-INF / lib文件夹中。确保将所有必需的库(罐)放在那里。您可以轻松查看:
- <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库,where you have to download and add the external libraries manually。
Maven个用户请注意:除非您将库设置为provided
,test
或system
,否则不应遇到这些问题。如果设置为provided
,则您负责在类路径中的某处添加库。您可以在此处找到有关依赖关系范围的更多信息:Introduction to the Dependency Mechanism
如果必须在将在应用程序服务器上部署的多个应用程序之间共享库,例如用于两个应用程序的MySQL连接器,还有另一种选择。不是使用自己的MySQL连接器库部署两个war文件,而是将此库放在服务器应用程序的公共库文件夹中,这将使库能够位于所有已部署应用程序的类路径中。
此文件夹与应用程序服务器不同。
<tomcat_home>
/ lib <jboss_home>
/ standalone / lib 答案 1 :(得分:0)
该类必须存在于WEB-INF / classes下,或者位于WEB-INF / lib下的.jar文件中。确保它确实如此。
答案 2 :(得分:0)
同样的问题发生在我身上。
您的某个库可能正在使用一些内部不可用的类
在你的lib或maven依赖pom.xml中。
这意味着您已分析错误日志并识别这些类,然后导入maven或lib文件夹中的所有依赖项。
我已经以同样的方式解决了这个错误。
因为我的一些库在内部使用了activation.jar和json.jar。