ClassNotFoundException/NoClassDefFoundError in my Java web application

10,198

What does this mean?

First, let's see the meaning of java.lang.ClassNotFoundException:

Thrown when an application tries to load in a class through its string name using:

  • The forName method in class Class.
  • The findSystemClass method in class ClassLoader.
  • The loadClass method in class ClassLoader.

but no definition for the class with the specified name could be found.

Usually, this happens when trying to open a connection manually in this form:

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

Or when you refer to a class that belongs to an external library and strangely this class cannot be loaded when the application server tries to deploy the application.

Let's see the meaning of java.lang.NoClassDefFoundError (emphasis mine):

Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.

The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.

The last part says it all: the class existed at compile time i.e. when I compiled the application through my IDE, but it is not available at runtime i.e. when the application is deployed.


how can I fix it?

In Java web applications, all third party libraries used by your application must go in WEB-INF/lib folder. Make sure that all the necessary libraries (jars) are placed there. You can check this easily:

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

This problem usually arises for JDBC connectivity jars (MySQL, Derby, MSSQL, Oracle, etc.) or web MVC frameworks libraries like JSF or Spring MVC.

Take into account that some third party libraries rely on other third party libraries, so you have to add all of them in WEB-INF/lib in order to make the application work. A good example of this is RichFaces 4 libraries, where you have to download and add the external libraries manually.


Note for Maven users: you should not experience these problems unless you have set the libraries as provided, test or system. If set to provided, you're responsible to add the libraries somewhere in the classpath. You can find more info about the dependency scopes here: Introduction to the Dependency Mechanism


In case the library must be shared among several applications that will be deployed on your application server e.g. MySQL connector for two applications, there's another alternative. Instead of deploying two war files each with their own MySQL connector library, place this library in the common library folder of the server application, this will enable the library to be in the classpath of all the deployed applications.

This folder vary from application server.

  • Tomcat 7/8: <tomcat_home>/lib
  • JBoss 7/Wildfly: <jboss_home>/standalone/lib
Share:
10,198
Luiggi Mendoza
Author by

Luiggi Mendoza

🤯 Wild software engineer unleashed in a crazy world 📺 One Piece, FMAB 🎮 Souls games 🧑🏽‍🍳 Peruvian &amp; keto food (kinda) 🌱 Gardener wannabe You can contact me anytime to [email protected]. My LinkedIn Profile.

Updated on June 04, 2022

Comments

  • Luiggi Mendoza
    Luiggi Mendoza almost 2 years

    I developer a web application using Java. When I deploy it to my application server (Jetty, Tomcat, JBoss, GlassFish, etc.) throws an error. I can see this error message in the stacktrace:

    java.lang.ClassNotFoundException
    

    Or

    java.lang.NoClassDefFoundError
    

    What does this mean and how can I fix it?