Home » Java Basics » exceptions » java.lang.NoClassDefFoundError – How to solve No Class Def Found Error

About Sotirios-Efstathios Maneas

Sotirios-Efstathios Maneas
Sotirios-Efstathios (Stathis) Maneas is a PhD student at the Department of Computer Science at the University of Toronto. His main interests include distributed systems, storage systems, file systems, and operating systems.

java.lang.NoClassDefFoundError – How to solve No Class Def Found Error

In this tutorial we will discuss about NoClassDefFoundError. This error is thrown when the Java Virtual Machine (JVM) or an instance of the ClassLoader class tries to load the definition of a class, but the definition could not be found. It extends the LinkageError class, which is used to indicate error cases, where a class has a dependency on some other class and that class has incompatibly changed after the compilation.

The definition of a class can be requested during a method call, or while creating a new instance using a new expression. Also, it is important to mention that the definition of the class existed when the application code was compiled, but the definition can no longer be found in the runtime.

 
Finally, the NoClassDefFoundError exists since the first version of Java.

The Structure of NoClassDefFoundError

Constructors

  • NoClassDefFoundError()
  • Creates an instance of the NoClassDefFoundError class.

  • NoClassDefFoundError(String s)
  • Creates an instance of the NoClassDefFoundError class, using the specified string as message.

The NoClassDefFoundError in Java

As we have already mentioned, the NoClassDefFoundError is thrown when the definition of class in not available during runtime. This error also indicates that the definition of the class was found during the compilation of the application, but it is not available in the application’s classpath during runtime. In general, this is a difficult error to deal with and through this tutorial, we will present a number of different solutions.

To begin with, let’s demonstrate an example that throws the aforementioned error. First, we define a Test class with a simple constructor:

Test.java:

public class Test {
        public Test() {
                System.out.println("A new instance of the Test class was created!");
        }
}

Then, we define a NoClassDefFoundErrorExample class that contains a static instance of the Test class:

NoClassDefFoundErrorExample.java:

public class NoClassDefFoundErrorExample {
        private static Test test = new Test();

        public static void main(String[] args) {
                System.out.println("The definition of Test was found!");
        }
}

The next step is to create an executable .jar file that shall execute the aforementioned main method. In order to achieve that, we first create a manifest file, called Manifest.txt and inside the file, we copy the following:

Main-Class: NoClassDefFoundErrorExample

Using the terminal (Linux or Mac) or the command prompt (Windows), we execute the following commands, in order to first, compile our source Java files and then, create our executable file:

javac Test.java
javac NoClassDefFoundErrorExample.java
jar cfm NoClassDefFoundErrorExample.jar Manifest.txt NoClassDefFoundErrorExample.class

Now, we are ready to execute our code using the following command:

java -jar NoClassDefFoundErrorExample.jar

A sample execution is shown below:

Exception in thread "main" java.lang.NoClassDefFoundError: TestClass
	at NoClassDefFoundErrorExample.(NoClassDefFoundErrorExample.java:2)
Caused by: java.lang.ClassNotFoundException: TestClass
	at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 1 more

The NoClassDefFoundError was thrown because the definition of the Test class was not included in the application’s classpath. If we execute the following command:

jar cfm NoClassDefFoundErrorExample.jar Manifest.txt NoClassDefFoundErrorExample.class Test.class

and then, execute our code, we shall get the following output:

A new instance of the TestClass was created!
The definition of TestClass was found!

The NoClassDefFoundError during static initialization

The NoClassDefFoundError can also be thrown during the static initialization of a class. If an exception occurs during the loading and initialization of a class and the definition of another class depends on the former class, then an ExceptionInInitializerError is thrown.

The following class reproduces the aforementioned problem:

StaticInitializationErrorExample.java:

import java.util.List;
import java.util.ArrayList;
import java.util.Random;

public class StaticInitializationErrorExample {

	private final static int TOTAL_RECORDS = 100;

	public static void main(String args[]) {
		try{
			List records = new ArrayList(TOTAL_RECORDS);

			for(int i=1; i < TOTAL_RECORDS; ++i)
				records.add(new Record(i));
		}
		catch(Throwable t) {
			t.printStackTrace();
			throw t;
		}
	}
}

class Record {
	private static Integer ID = getRandomInteger();

	public Record(Integer Id){
		this.ID = Id;
	}

	private static Integer getRandomInteger() {
		throw new RuntimeException("The method is not implemented...");
		//return new Random.nextInt();
	}
}

In this example, we defined a Record class with a static field, called ID. When, the Record class is about to get loaded and initialized, the getRandomInteger() method throws a RuntimeException and thus, the main method that is static and requires the definition of the Record class throws an ExceptionInInitializerError.

A sample execution is shown below:

java.lang.ExceptionInInitializerError
	at StaticInitializationErrorExample.main(StaticInitializationErrorExample.java:14)
Caused by: java.lang.RuntimeException: The method is not implemented...
	at Record.getRandomInteger(StaticInitializationErrorExample.java:31)
	at Record.(StaticInitializationErrorExample.java:24)
	... 1 more
Exception in thread "main" java.lang.ExceptionInInitializerError
	at StaticInitializationErrorExample.main(StaticInitializationErrorExample.java:14)
Caused by: java.lang.RuntimeException: The method is not implemented...
	at Record.getRandomInteger(StaticInitializationErrorExample.java:31)
	at Record.(StaticInitializationErrorExample.java:24)
	... 1 more

How to deal with the NoClassDefFoundError

  • Verify that all required Java classes are included in the application’s classpath. The most common mistake is not to include all the necessary classes, before starting to execute a Java application that has dependencies on some external libraries.
  • The classpath of the application is correct, but the Classpath environment variable is overridden before the application’s execution.
  • Verify that the aforementioned ExceptionInInitializerError does not appear in the stack trace of your application.

 
This was a tutorial about the NoClassDefFoundError in Java.

Do you want to know how to develop your skillset to become a Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you our best selling eBooks for FREE!

 

1. JPA Mini Book

2. JVM Troubleshooting Guide

3. JUnit Tutorial for Unit Testing

4. Java Annotations Tutorial

5. Java Interview Questions

6. Spring Interview Questions

7. Android UI Design

 

and many more ....

 

 

Want to take your Java skills to the next level?

Grab our programming books for FREE!

Here are some of the eBooks you will get:

  • Spring Interview QnA
  • Multithreading & Concurrency QnA
  • JPA Minibook
  • JVM Troubleshooting Guide
  • Advanced Java
  • Java Interview QnA
  • Java Design Patterns