Почему я получаю NoClassDefFoundError в Java?

Я получаю NoClassDefFoundError при запуске приложения Java. Что обычно является причиной этого?

496
задан 19.05.2020, 20:55

5 ответов

Это вызывается, когда существует файл класса, от которого зависит Ваш код, и это присутствует во время компиляции, но не найдено во времени выполнения. Ищите различия в свое время изготовления и пути к классам во время выполнения.

242
ответ дан 19.05.2020, 20:57
  • 1
    @R, спасибо, я didn' t понимают это wasn' t последняя версия. Но это было только удалено из раздела возвращаемого значения. Описание все еще читает, " строка указала, может быть перезаписан последующим вызовом к getenv () [...] ". я don' t думают, изменяя environ, решение, так как оно говорит, " Соответствующие приложения требуются не изменить, окружают непосредственно " I' m не уверенный, почему there' s все еще никакой getenv_r вызов. – Matthew Flaschen 30.10.2019, 01:07

В случае, если вы сгенерировали код (EMF и т. Д.), Может быть слишком много статических инициализаторов, которые занимают все пространство стека.

См. Вопрос переполнения стека Как увеличить размер стека Java? .

3
ответ дан 19.05.2020, 20:56

Я получил ошибки NoClassDefFound, когда не экспортировал класс на вкладке «Порядок и экспорт» в пути сборки Java моего проекта. Обязательно поставьте галочку на вкладке «Заказ и экспорт» всех зависимостей, которые вы добавляете в путь сборки проекта. См. Предупреждение затмения: XXXXXXXXXXX.jar не будет экспортирован или опубликован. Время выполнения ClassNotFoundExceptions может привести к .

0
ответ дан 19.05.2020, 21:01

Я получаю NoClassFoundError, когда классы, загруженные загрузчиком классов среды выполнения, не могут получить доступ к классам, уже загруженным загрузчиком Java. Поскольку разные загрузчики классов находятся в разных доменах безопасности (согласно java), jvm не позволит разрешать классы, уже загруженные корневым загрузчиком, в адресном пространстве загрузчика времени выполнения.

Запустите вашу программу с помощью 'java -javaagent: tracer.jar [YOUR java ARGS]'

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

// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5

import java.lang.instrument.*;
import java.security.*;

// manifest.mf
// Premain-Class: ClassLoadTracer

// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class

// java -javaagent:tracer.jar  [...]

public class ClassLoadTracer 
{
    public static void premain(String agentArgs, Instrumentation inst) 
    {
        final java.io.PrintStream out = System.out;
        inst.addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

                String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
                out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);

                // dump stack trace of the thread loading class 
                Thread.dumpStack();

                // we just want the original .class bytes to be loaded!
                // we are not instrumenting it...
                return null;
            }
        });
    }
}
5
ответ дан 19.05.2020, 21:04
  • 1
    Достаточно ярмарка. Для начала работы Вам будет нужен компилятор C++, который является программой для превращения исходного кода во что-то, с чем компьютер может работать. Я рекомендовал бы превосходный компилятор GCC (его свободное). Порт Windows называют MinGW. Если Вы используете этот IDE: bloodshed.net/devcpp.html Вы получите среду разработки и компилятор бесплатно. I' m уверенный кто-то оставит комментарий, говоря Вам использовать Microsoft Visual * или Eclipse, но когда Вы просто начнетесь с языком, я чувствую, что более простой редактор/язь лучше. Теперь все, в чем Вы нуждаетесь, является хорошей книгой или веб-сайтом. – Alex 15.10.2019, 20:04

Я обнаружил, что иногда я получаю ошибку NoClassDefFound, когда код компилируется с несовместимой версией класса, найденной во время выполнения. Конкретный экземпляр, который я помню, связан с библиотекой оси Apache На моем пути к классам во время выполнения на самом деле было две версии, и он выбирал устаревшую и несовместимую версию, а не правильную, вызывая ошибку NoClassDefFound. Это было в приложении командной строки, где я использовал команду, подобную этой.

set classpath=%classpath%;axis.jar

Я смог заставить его подобрать правильную версию, используя:

set classpath=axis.jar;%classpath%;
31
ответ дан 19.05.2020, 21:07
  • 1
    Я ожидал бы, что кто-либо, кто использовал for line in f.xreadlines():, преобразует его в for line in f: несколько лет назад. – John Machin 19.10.2019, 14:19

Теги

Похожие вопросы