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

вы можете получить его с помощью

var element = document.getElementById(canvasId);
element.onmousemove = function(e) {
    var xCoor = e.clientX;
    var yCoor = e.clientY;
}
484
задан Duncan Jones 11 April 2014 в 10:38
поделиться

7 ответов

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

237
ответ дан Mocky 11 April 2014 в 10:38
поделиться

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

0
ответ дан Steve Stilson 11 April 2014 в 10:38
поделиться

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

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

3
ответ дан Peter Mortensen 11 April 2014 в 10:38
поделиться

Я получаю 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
ответ дан codeDr 11 April 2014 в 10:38
поделиться

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

set classpath=%classpath%;axis.jar

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

set classpath=axis.jar;%classpath%;
31
ответ дан shsteimer 11 April 2014 в 10:38
поделиться

Это могло также быть, потому что Вы копируете файл кода с IDE с определенным именем пакета, и Вы хотите попытаться выполнить его с помощью терминала. Необходимо будет удалить имя пакета из кода сначала. Это происходит со мной.

0
ответ дан 22 November 2019 в 22:35
поделиться

Я получил эту ошибку, когда я добавляю зависимость Знатока другого модуля к моему проекту, проблема была наконец решена, добавляют -Xss2m к опции JVM моей программы (Это - один мегабайт по умолчанию начиная с JDK5.0). Это полагало, что программа не имеет достаточного количества стека для загрузки класса.

0
ответ дан 22 November 2019 в 22:35
поделиться
Другие вопросы по тегам:

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