这是什么意思?
首先我们来看看它的含义java.lang.ClassNotFoundException http://docs.oracle.com/javase/8/docs/api/java/lang/ClassNotFoundException.html:
当应用程序尝试通过其字符串名称加载类时抛出:
- The
forName
类中的方法Class
.
- The
findSystemClass
类中的方法ClassLoader
.
- The
loadClass
类中的方法ClassLoader
.
但找不到具有指定名称的类的定义。
通常,当尝试以这种形式手动打开连接时会发生这种情况:
String jdbcDriver = "...'; //name of your driver
Class.forName(jdbcDriver);
或者当您引用属于外部库的类并且奇怪地当应用程序服务器尝试部署应用程序时,无法加载此类。
我们来看看它的含义java.lang.NoClassDefFoundError http://docs.oracle.com/javase/8/docs/api/java/lang/NoClassDefFoundError.html(强调我的):
如果 Java 虚拟机或ClassLoader
实例尝试加载类的定义(作为正常方法调用的一部分或作为使用 new 表达式创建新实例的一部分),但找不到该类的定义。
搜索到的类定义在编译当前执行的类时已存在,但无法再找到该定义.
最后一部分说明了一切:该类在编译时存在,即当我通过 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)中。
考虑到一些第三方库依赖other第三方库,所以你必须添加他们全部在 WEB-INF/lib 中以使应用程序正常工作。 RichFaces 4 库就是一个很好的例子,您必须手动下载并添加外部库 https://community.jboss.org/wiki/HowToAddRichFaces4xToProjectsNotBasedOnMaven.
注意事项Maven http://maven.apache.org/用户:除非您将库设置为provided
, test
or system
。如果设置为provided
,您负责将库添加到类路径中的某个位置。您可以在此处找到有关依赖范围的更多信息:依赖机制介绍 http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
如果库必须在将部署在应用程序服务器上的多个应用程序之间共享,例如对于两个应用程序的 MySQL 连接器,还有另一种选择。不要部署两个 war 文件,每个文件都有自己的 MySQL 连接器库,而是将该库放置在服务器应用程序的公共库文件夹中,这将使该库位于所有已部署应用程序的类路径中。
此文件夹因应用程序服务器而异。
- 雄猫 7/8:
<tomcat_home>
/lib
- JBoss 7/野蝇:
<jboss_home>
/独立/lib