Я получаю NoClassDefFoundError
при запуске приложения Java. Что обычно является причиной этого?
В случае, если вы сгенерировали код (EMF и т. Д.), Может быть слишком много статических инициализаторов, которые занимают все пространство стека.
См. Вопрос переполнения стека Как увеличить размер стека Java? .
Я получил ошибки NoClassDefFound, когда не экспортировал класс на вкладке «Порядок и экспорт» в пути сборки Java моего проекта. Обязательно поставьте галочку на вкладке «Заказ и экспорт» всех зависимостей, которые вы добавляете в путь сборки проекта. См. Предупреждение затмения: XXXXXXXXXXX.jar не будет экспортирован или опубликован. Время выполнения ClassNotFoundExceptions может привести к .
Я получаю 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;
}
});
}
}
Я обнаружил, что иногда я получаю ошибку NoClassDefFound, когда код компилируется с несовместимой версией класса, найденной во время выполнения. Конкретный экземпляр, который я помню, связан с библиотекой оси Apache На моем пути к классам во время выполнения на самом деле было две версии, и он выбирал устаревшую и несовместимую версию, а не правильную, вызывая ошибку NoClassDefFound. Это было в приложении командной строки, где я использовал команду, подобную этой.
set classpath=%classpath%;axis.jar
Я смог заставить его подобрать правильную версию, используя:
set classpath=axis.jar;%classpath%;
for line in f.xreadlines():
, преобразует его в for line in f:
несколько лет назад.
– John Machin
19.10.2019, 14:19
environ
, решение, так как оно говорит, " Соответствующие приложения требуются не изменить, окружают непосредственно " I' m не уверенный, почему there' s все еще никакойgetenv_r
вызов. – Matthew Flaschen 30.10.2019, 01:07