При использовании данного кода:
Возникает ошибка 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:UsersLevchenkoAppDataLocalNetBeansCache8.2executor-snippets
un.xml:53: Java returned: 1
Подскажите, пожалуйста, почему возникает ошибка. Возможно, я подключил не все библиотеки которые нужны.
Добавил библиотеки. В структуре проекта теперь 3 библиотеки: sardine, httpclient, http core. Вот что получилось:
I’ve tried both the example in Oracle’s Java Tutorials. They both compile fine, but at run-time, both come up with this error:
I think I might have the Main.java file in the wrong folder. Here is the directory hierarchy:
And here is Main.java :
What am I doing wrong here?
UPDATE
After I put put the Main class into the graphics package (I added package graphics; to it), set the classpath to «_test» (folder containing graphics), compiled it, and ran it using java graphics.Main (from the command line), it worked.
Really late UPDATE #2
I wasn’t using Eclipse (just Notepad++ and the JDK), and the above update solved my problem. However, it seems that many of these answers are for Eclipse and IntelliJ, but they have similar concepts.
23 Answers 23
After you compile your code, you end up with .class files for each class in your program. These binary files are the bytecode that Java interprets to execute your program. The NoClassDefFoundError indicates that the classloader (in this case java.net.URLClassLoader ), which is responsible for dynamically loading classes, cannot find the .class file for the class that you’re trying to use.
Your code wouldn’t compile if the required classes weren’t present (unless classes are loaded with reflection), so usually this exception means that your classpath doesn’t include the required classes. Remember that the classloader (specifically java.net.URLClassLoader ) will look for classes in package a.b.c in folder a/b/c/ in each entry in your classpath. NoClassDefFoundError can also indicate that you’re missing a transitive dependency of a .jar file that you’ve compiled against and you’re trying to use.
For example, if you had a class com.example.Foo , after compiling you would have a class file Foo.class . Say for example your working directory is . /project/ . That class file must be placed in . /project/com/example , and you would set your classpath to . /project/ .
Side note: I would recommend taking advantage of the amazing tooling that exists for Java and JVM languages. Modern IDE’s like Eclipse and IDEA and build management tools like Maven or Gradle will help you not have to worry about classpaths (as much) and focus on the code! That said, this link explains how to set the classpath when you execute on the command line.
Я пробовал оба примера в Oracle Учебные Пособия По Java. Они оба компилируются нормально, но во время выполнения оба придумывают эту ошибку:
Я думаю, что у меня может быть Main.java файл в неправильной папке. Вот иерархия каталогов:
что я здесь делаю не так?
обновление
после того, как я поставил тег Main класса в graphics пакет (я добавил package graphics; к нему), установите classpath в » _test «(папка, содержащая графику), скомпилировал его и запустил с помощью java graphics.Main (из командной строки), он работал.
действительно позднее обновление #2
Я не использовал Eclipse (только Notepad++ и JDK), и вышеупомянутое обновление решило мою проблему. Однако кажется, что многие из этих ответов предназначены для Eclipse и IntelliJ, но у них есть похожие концепции.
23 ответов
после компиляции кода Вы получаете .class файлы для каждого класса в вашей программе. Эти двоичные файлы являются байт-кодом, который Java интерпретирует для выполнения вашей программы. The NoClassDefFoundError указывает, что classloader (в этом случае java.net.URLClassLoader ), которая отвечает за динамическую загрузку классов, не может найти для класса, который вы пытаетесь использовать.
ваш код не будет компилироваться, если необходимые классы не присутствуют (если классы не загружены с отражение), поэтому обычно это исключение означает, что ваш путь к классам не включает требуемые классы. Помните, что classloader (в частности java.net.URLClassLoader ) будет искать классы в пакете a.b.c в папке a/b/ c / в каждой записи в пути к классам. NoClassDefFoundError также может указывать на отсутствие транзитивной зависимости a .jar-файл, который вы скомпилировали и пытаетесь использовать.
например, если у вас был класс com.example.Foo , после компиляции у вас будет файл класса Foo.class . Скажем, например, ваш рабочий каталог . /project/ . Этот файл класса должен быть помещен в . /project/com/example , и вы установили бы свой путь к классам в . /project/ .
примечание: Я бы рекомендовал воспользоваться удивительным инструментарием, который существует для языков Java и JVM. Современные IDE, такие как Eclipse и IDEA, и инструменты управления сборкой, такие как Maven или Gradle, помогут вам не беспокоиться о путях классов (столько же) и сосредоточиться на коде! Что сказал:этой ссылке объясняет, как установить classpath при выполнении в командной строке.
Я хотел бы исправить точку зрения других на NoClassDefFoundError .
NoClassDefFoundError может произойти по нескольким причинам, как
- — ClassNotFoundException .класс не найден для этого ссылочного класса независимо от того, доступен ли он во время компиляции или нет(i.e базовый / дочерний класс).
- файл класса находится, но исключение возникает при инициализации статических переменных
класса, расположенный, исключение повышено, инициализация статических блоков
в исходном вопросе это был первый случай, который можно исправить, установив CLASSPATH в файл jar ссылочных классов или в его папку пакета.
что это означает, говоря «доступно во время компиляции»?
- указанный класс используется в коде.
например: два класса, A и B (расширяет A). Если B упоминается непосредственно в коде, это доступно во время компиляции, т. е. a = new B ();
что это означает, говоря «недоступно во время компиляции»?
- класс времени компиляции и класс времени выполнения различны, т. е., например, базовый класс загружается с использованием classname дочернего класса, например Класс.forName («classname»)
Например: два класса, A и B(расширяет). Код
A a = Класс.forName («B»).newInstance ();
NoClassDefFoundError означает, что класс присутствует в classpath в Compile time , но он не существует в classpath в Runtime .
если вы используете Eclipse, убедитесь, что у вас есть shapes , linepoints и spaceobjects в записи .
Источник: