当前位置: 首页 > 面试题库 >

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

谭飞掣
2023-03-14
问题内容

我使用Java开发Web应用程序。当我将其部署到我的应用程序服务器(Jetty,Tomcat,JBoss,GlassFish等)时,将引发错误。我可以在stacktrace中看到此错误消息:

java.lang.ClassNotFoundException

要么

java.lang.NoClassDefFoundError

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


问题答案:

这是什么意思?

首先,让我们看一下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文件夹中。确保将所有必需的库(jar)放置在此处。您可以轻松检查以下内容:

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

对于JDBC连接罐(MySQL,Derby,MSSQL,Oracle等)或Web MVC框架库(如JSF或Spring MVC),通常会出现此问题。

考虑到某些第三方库依赖于 其他 第三方库,因此必须将 它们全部 添加到WEB-INF / lib中才能使应用程序正常工作。RichFaces
4库就是一个很好的例子,您必须在其中手动下载和添加外部库。

Maven用户注意事项:除非将库设置为或provided,否则不应遇到这些问题。如果设置为,则负责将库添加到类路径中的某处。您可以在此处找到有关依赖范围的更多信息:依赖机制简介test``system``provided

如果必须在将要部署在您的应用程序服务器上的多个应用程序之间共享该库,例如用于两个应用程序的MySQL连接器,则还有另一种选择。无需将两个war文件分别使用各自的MySQL连接器库进行部署,而是将该库放置在服务器应用程序的公共库文件夹中,这将使该库位于所有已部署应用程序的类路径中。

此文件夹与应用程序服务器不同。

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


 类似资料:
  • 我正在开发一个使用Hibernate的简单JSF应用程序。我将所有必需的库导入WEB-INF/lib文件夹,并将它们指向类路径。但是当我尝试编译它时,我遇到了错误: 这是我创建SessionFactory并使用它的代码: 我在这里使用它: 那我做错了什么?我该怎么解决这个问题?

  • 已安装Java版本(签入控制面板): jre1.6.0,Java更新2, Java更新3, Java更新5, Java更新31 (在C:/Program Files/Java相关文件夹中找到:jre1.6.0、jre1.6.0_02、jre1.6.0_03、jre1.6.0_05、jre6) 根据http://docs.oracle.com/javase/1.5.0/docs/guide/java

  • 您好 每次在Eclipse中创建Android应用程序时,我都会得到一个ClassNotFoundException。在使用eclipse几个月之后,直到今天早上,这是从未发生过的事情。还值得一提的是,今天早上我通过SDK管理器安装了google play服务 logcat: manifest.xml: 如果有任何帮助,我会非常感激,因为我对此一无所知。

  • 我正在尝试将mopub添加到我的应用程序中。我通过AndroidStudio插件安装了sdk。并将其添加到我的xml中 在com.example.hroshandel.myapplication.simpleintro_fragmentactivity.oncreate(Simpleintro_fragmentactivity.java:20) 由:java.lang.ClassNotFoundE

  • 我有一个在web容器tomcat上运行的java web应用程序。该web应用程序使用hibernate框架连接到DB,我需要将其从IntelliJ 14.0.2部署到heruko。所以我添加了maven框架,这就是pom。xml: 当设置maven的编辑配置并运行它时,我得到一条消息:[错误]在当前项目和插件组[org.apache.maven.plugins,org.codehaus.mojo