Поиск по сайту:

java.lang.NoClassDefFoundError


java.lang.NoClassDefFoundError — это ошибка времени выполнения, возникающая, когда требуемый класс не найден в пути к классам, и, следовательно, JVM не может загрузить его в память.

java.lang.NoClassDefFoundError

  • NoClassDefFoundError — это ошибка времени выполнения, поэтому предвидеть ее и устранить ее невозможно в рамках нашего приложения.
  • java.lang.NoClassDefFoundError — это ошибка времени выполнения, она никогда не возникает во время компиляции.
  • Отлаживать NoClassDefFoundError очень легко, поскольку в нем четко указано, что JVM не удалось найти требуемый класс, поэтому проверьте конфигурации пути к классам, чтобы убедиться, что необходимые классы не пропущены.

Диаграмма класса NoClassDefFoundError

java.lang.NoClassDefFoundError Причины

Давайте сначала попробуем воспроизвести сценарий, в котором мы получаем NoClassDefFoundError во время выполнения. Допустим, у нас есть классы Java, как показано ниже.

public class Data {

	private int id;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
}

Обратите внимание, что приведенный выше класс не зависит ни от каких других пользовательских классов Java, он просто использует встроенные классы Java. Давайте создадим еще один класс, который будет использовать класс Data в том же каталоге.

public class DataTest {

	public static void main(String[] args) {
		Data data = new Data();
		data.setId(10);
		System.out.println("Data Id = "+data.getId());
	}

}

Теперь давайте скомпилируем класс DataTest, а затем выполним его, как показано ниже.

pankaj:temp pankaj$ ls
Data.java	DataTest.java
pankaj:temp pankaj$ javac DataTest.java 
pankaj:temp pankaj$ ls 
Data.class	Data.java	DataTest.class	DataTest.java
pankaj:temp pankaj$ java DataTest
Data Id = 10
pankaj:temp pankaj$

Пока все в порядке, теперь давайте переместим файлы класса Data в другое место, а затем попробуем выполнить класс DataTest. Мы не будем компилировать его снова, так как тогда он выдаст ошибку компиляции.

pankaj:temp pankaj$ mv Data.java Data.class ../
pankaj:temp pankaj$ ls
DataTest.class	DataTest.java
pankaj:temp pankaj$ java DataTest
Exception in thread "main" java.lang.NoClassDefFoundError: Data
	at DataTest.main(DataTest.java:5)
Caused by: java.lang.ClassNotFoundException: Data
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 1 more
pankaj:temp pankaj$ 

Как устранить ошибку java.lang.NoClassDefFoundError?

Из приведенного выше примера мы можем четко определить, что единственная причина этой ошибки заключается в том, что необходимые классы были доступны во время компиляции, но не во время выполнения. Вы можете исправить ошибку NoClassDefFoundError, проверив следующее:

  • Check the exception stack trace to know exactly which class throw the error and which is the class not found by java.

  • Next step is to look for classpath configuration, sometimes we compile our classes in Eclipse or some other environment and run in some other environment and we can miss classpath configurations. For example, I can fix above issue easily by adding the directory which contains Data class to the classpath like below.

    pankaj:temp pankaj$ java -classpath .:.. DataTest
    Data Id = 10
    pankaj:temp
    

    Remember that earlier I had moved Data class to previous directory.

  • Most of the times, NoClassDefFoundError comes with applications running on some server as web application or web services, in that case check if the required jars are part of the WAR file or not. For example, below maven configuration will not package jar file when generating WAR file.

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    

    But we need it for creating a servlet based web application, usually this jar is always part of Tomcat or any other application server.

Это все, что нужно для беглого просмотра java.lang.NoClassDefFoundError. Надеюсь, вы найдете достаточно идей, когда появляется эта ошибка и как ее легко исправить. Ссылка: Обработка исключений в Java