Почему возникает java.lang.NoClassDefFoundError?

328
01 марта 2017, 19:30

При использовании данного кода:

package javaapplication;
import com.github.sardine.DavResource;
import com.github.sardine.Sardine;
import com.github.sardine.SardineFactory;
import java.io.IOException;
import java.util.List;
public class JavaApplication {
    public static void main(String[] args) throws IOException {
        Sardine sardine = SardineFactory.begin("login", "password");
        List<DavResource> resources;
        resources = sardine.list("http://yourdavserver.com/adirectory/");
        for (DavResource res : resources)
        {
            System.out.println(res);
        }
    }
}

Возникает ошибка NoClassDefFoundError:

run: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/HttpEntity at com.github.sardine.SardineFactory.begin(SardineFactory.java:44) at com.github.sardine.SardineFactory.begin(SardineFactory.java:34) at javaapplication.JavaApplication.main(JavaApplication.java:25) Caused by: java.lang.ClassNotFoundException: org.apache.http.HttpEntity at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 3 more C:\Users\Levchenko\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1

Подскажите, пожалуйста, почему возникает ошибка. Возможно, я подключил не все библиотеки которые нужны.

Добавил библиотеки. В структуре проекта теперь 3 библиотеки: sardine, httpclient, http core. Вот что получилось:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at org.apache.http.conn.ssl.AbstractVerifier.(AbstractVerifier.java:61) at org.apache.http.conn.ssl.AllowAllHostnameVerifier.(AllowAllHostnameVerifier.java:44) at org.apache.http.conn.ssl.AllowAllHostnameVerifier.(AllowAllHostnameVerifier.java:46) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.(SSLConnectionSocketFactory.java:146) at com.github.sardine.impl.SardineImpl.createDefaultSecureSocketFactory(SardineImpl.java:1116) at com.github.sardine.impl.SardineImpl.createDefaultSchemeRegistry(SardineImpl.java:1099) at com.github.sardine.impl.SardineImpl.configure(SardineImpl.java:1064) at com.github.sardine.impl.SardineImpl.(SardineImpl.java:203) at com.github.sardine.SardineFactory.begin(SardineFactory.java:44) at com.github.sardine.SardineFactory.begin(SardineFactory.java:34) at javaapplication.JavaApplication.main(JavaApplication.java:25) Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 11 more C:\Users\Levchenko\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1

Answer 1

Ошибка NoClassDefFoundError возникает когда класс от которого зависит ваше приложение недоступен при исполнении кода.

Описание ошибки в документации:

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.

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

Скорее всего ошибка вызвана тем, что одна из библиотек, требуемых для работы вашего приложения не добавлена в classpath.

Для исправления ошибки нужно:

  • посмотреть на имя отсутствующего класса в сообщении об ошибке;
  • проверить при обращении к какому классу возникает ошибка;
  • найти библиотеку (зависимость, если используется система сборки Maven, Gradle), в которой находится класс;
  • проверить что библиотека доступна при исполении кода (JAR-файл библиотеки находится в classpath).

Похожий вопрос в английской версии Stackoverflow:

  • Why am I getting a NoClassDefFoundError in Java?

Ваш пример

В данном случае имя класса org/apache/http/HttpEntity. Он находится в библиотеке Apache HttpComponents Core. Скачать ее можно в репозитории Maven (https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore/4.4.3).

Sardine зависит от библиотеки Apache HttpComponents Client версии 4.5.1, которая в свою очередь зависит от Apache HttpComponents Core версии 4.4.3. Скорее всего Вам понадобится подключить обе эти библиотеки как минимум.

Добавьте библиотеки и попробуйте запустить заново.

READ ALSO
как создать облачный сервис?

как создать облачный сервис?

Здравствуйте, хотелось бы узнать, по каким технологиям создают облачные сервисы типа Cloud games? Грубо говоря, виртуализация железа или софта,...

293
Не выгружаются изображения из памяти

Не выгружаются изображения из памяти

ЗдравствуйтеСтолкнулся с проблемой

211
TestNG: testng doesn&#39;t support the &ldquo;mode&rdquo; attribute

TestNG: testng doesn't support the “mode” attribute

ЗдравствуйтеНе так давно, когда изучал TestNG, все работало

275
Что делать, если нужен доступ к переменной ,которая инициализирована в другом классе, а создать экземпляр того класса нельзя

Что делать, если нужен доступ к переменной ,которая инициализирована в другом классе, а создать экземпляр того класса нельзя

В связи с некой архитектурой , получить экземпляр класса в котором инициализирована переменная не могуМогу эту переменную объявить как статик

253