font - oracle java jlabel




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

Две копии экземпляра одного и того же проекта

В моем случае проблема заключалась в неспособности Eclipse различать две разные копии одного и того же проекта. У меня есть одна блокировка на багажнике (контроль версий SVN), а другой - в одной ветви за раз. Я опробовал одно изменение в рабочей копии как тестовый пример JUnit, который включал в себя извлечение частного внутреннего класса для самостоятельного публичного класса, и пока он работал, я открываю другую копию проекта, чтобы посмотреть вокруг на другой часть кода, которая нуждается в изменениях. В какой-то момент NoClassDefFoundError появился, жалуясь, что частного внутреннего класса там нет; двойной щелчок в трассировке стека привел меня к исходному файлу в неправильной копии проекта.

Закрытие внешней копии проекта и запуск тестового примера снова избавилось от проблемы.

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


Java не смог найти класс A во время выполнения. Класс A был в проекте Artline из maven из другого рабочего пространства. Поэтому я импортировал ArtClient в проект Eclipse. Два из моих проектов использовали ArtClient в качестве зависимости. Я изменил ссылку на библиотеку для ссылки на проект для этих (Путь сборки -> Настроить путь сборки).

И проблема исчезла.


Если кто-то приходит сюда из-за ошибки java.lang.NoClassDefFoundError: org/apache/log4j/Logger , в моем случае он был создан, потому что я использовал log4j 2 (но я не добавлял все файлы, которые приходят с ним), а некоторые библиотека зависимостей log4j 1. Решением было добавить мост Log4j 1.x: jar log4j-1.2-api-<version>.jar который поставляется с log4j 2. Дополнительная информация в migration log4j 2.


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

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


У меня была та же проблема, и я был запас в течение многих часов.

Я нашел решение. В моем случае из-за этого был установлен статический метод. JVM не может создать другой объект этого класса.

Например,

private static HttpHost proxy = new HttpHost(proxyHost, Integer.valueOf(proxyPort), "http");

Убедитесь, что это соответствует module:app и module:lib :

android {
    compileSdkVersion 23
    buildToolsVersion '22.0.1'
    packagingOptions {
    }

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 11
        versionName "2.1"
    }

Эта ошибка может быть вызвана неконтролируемыми требованиями к Java-версии .

В моем случае я смог разрешить эту ошибку, SDKMAN! проект с открытым исходным кодом, переключившись с Java 9 на Java 8 с помощью SDKMAN! ,

sdk list java
sdk install java 8u152-zulu
sdk use java 8u152-zulu

Затем выполните чистую установку, как описано ниже.

При использовании Maven в качестве инструмента сборки иногда полезно - и, как правило, приятно, сделать чистую сборку «установка» с отключенным тестированием .

mvn clean install -DskipTests

Теперь, когда все было построено и установлено, вы можете продолжить тесты.

mvn test

Это лучшее решение, которое я нашел до сих пор.

Предположим, у нас есть пакет org.mypackage содержащий классы:

  • HelloWorld (основной класс)
  • SupportClass
  • UtilClass

и файлы, определяющие этот пакет, хранятся физически в каталоге D:\myprogram (в Windows) или /home/user/myprogram (в Linux).

Структура файла будет выглядеть так:

Когда мы вызываем Java, мы указываем имя запускаемого приложения: org.mypackage.HelloWorld . Однако мы также должны сказать Java, где искать файлы и каталоги, определяющие наш пакет. Поэтому, чтобы запустить программу, мы должны использовать следующую команду:


Я использовал Spring Framework с Maven и решил эту ошибку в своем проекте.

В классе произошла ошибка времени выполнения. Я читал свойство как целое, но когда он считывал значение из файла свойств, его значение было двойным.

Spring не дал мне полную трассировку стека, на которой строка времени выполнения не удалась. Он просто сказал NoClassDefFoundError . Но когда я выполнил его как родное Java-приложение (взяв его из MVC), он дал ExceptionInInitializerError который был истинной причиной, и именно так я отслеживаю ошибку.

Ответ @ xli дал мне представление о том, что может быть неправильным в моем коде.


Я исправил свою проблему, отключив preDexLibraries для всех модулей:

dexOptions {
        preDexLibraries false
        ...

Я получаю 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;
            }
        });
    }
}

Я получил это сообщение после удаления двух файлов из библиотеки SRC, и когда я вернул их, я продолжал видеть это сообщение об ошибке.

Моим решением было: Перезапустить Eclipse. С тех пор я еще не видел этого сообщения :-)


NoClassDefFoundError В Java

Определение:

  1. Java Virtual Machine не может найти определенный класс во время выполнения, который был доступен во время компиляции.

  2. Если во время компиляции класс присутствовал, но недоступен в java classpath во время выполнения.

Примеры:

  1. Класс не находится в Classpath, нет уверенного способа узнать его, но много раз вы можете просто взглянуть на печать System.getproperty («java.classpath»), и он выведет путь к классу, откуда вы можете хотя бы получить представление о вашем фактическом пути пути выполнения.
  2. Простым примером NoClassDefFoundError является класс, принадлежащий отсутствующему файлу JAR, или JAR не был добавлен в classpath, или иногда имя jar было изменено кем-то вроде моего случая. Один из моих коллег изменил tibco.jar на tibco_v3.jar, и программа не удалось с java.lang.NoClassDefFoundError, и мне было интересно, что случилось.

  3. Просто попробуйте запустить с явно параметром -classpath с classpath, который, по вашему мнению, будет работать, и если он работает, то это верный короткий знак того, что кто-то переопределяет java classpath.

  4. Разрешение проблемы в JAR-файле также может вызвать NoClassDefFoundError в Java.
  5. Typo on XML Configuration также может вызывать NoClassDefFoundError в Java.
  6. когда ваш скомпилированный класс, который определен в пакете, не присутствует в одном пакете во время загрузки, как в случае с JApplet, он будет вызывать NoClassDefFoundError в Java.

Возможные решения:

  1. Класс недоступен в Java Classpath.
  2. Если вы работаете в среде J2EE, чем видимость класса среди нескольких Classloader также может вызвать java.lang.NoClassDefFoundError, см. Примеры и сценарий для подробного обсуждения.
  3. Проверьте java.lang.ExceptionInInitializerError в вашем файле журнала. NoClassDefFoundError из-за сбоя статической инициализации довольно распространен.
  4. Поскольку NoClassDefFoundError является подклассом java.lang.LinkageError, он также может появиться, если некоторая его зависимость, например, родная библиотека, недоступна.
  5. Любой стартовый скрипт переопределяет переменную среды Classpath.
  6. Возможно, вы запускаете свою программу с помощью команды jar, и класс не был определен в атрибуте ClassPath файла манифеста.

Ресурсы:

3 способа решения NoClassDefFoundError

java.lang.NoClassDefFoundError Шаблоны проблем





noclassdeffounderror