Самый простой:
var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", "")); Var newDate = новая дата (milisegundos) .toLocaleDateString ("en-UE");
Это вызвано тем, что есть файл класса, от которого зависит ваш код, и он присутствует во время компиляции, но не найден во время выполнения. Ищите различия в времени сборки и классах времени выполнения.
NoClassDefFoundError В Java
Определение:
Примеры:
Возможные решения:
Ресурсы:
Техника ниже помогла мне много раз:
System.out.println(TheNoDefFoundClass.class.getProtectionDomain().getCodeSource().getLocation());
, где TheNoDefFoundClass - это класс, который может быть «потерян» из-за предпочтения старой версии той же библиотеки, что и ваша программа. Это чаще всего случается с случаями, когда клиентское программное обеспечение развертывается в доминирующем контейнере, вооружившись его собственными загрузчиками классов и множеством древних версий самых популярных библиотек.
Я получаю 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;
}
});
}
}
В моем случае проблема заключалась в невозможности дифференциации Eclipse между двумя разными копиями одного и того же проекта. У меня есть одна блокировка на багажнике (контроль версий SVN), а другой - в одной ветви за раз. Я опробовал одно изменение в рабочей копии как тестовый пример JUnit, который включал в себя извлечение частного внутреннего класса для самостоятельного публичного класса, и пока он работал, я открываю другую копию проекта, чтобы посмотреть вокруг на другой часть кода, которая нуждается в изменениях. В какой-то момент NoClassDefFoundError
появился, жалуясь, что частного внутреннего класса не было; двойной щелчок в трассировке стека привел меня к исходному файлу с неправильной копией проекта.
Закрытие внешней копии проекта и запуск тестового примера снова избавилось от проблемы.
Я исправил свою проблему, отключив preDexLibraries для всех модулей:
dexOptions {
preDexLibraries true
...
Эта ошибка может быть вызвана неконтролируемыми требованиями к Java-версии.
В моем случае я смог разрешить эту ошибку, создав высокопрофильный проект с открытым исходным кодом, переключившись с Java 9 на Java 8 используя SDKMAN! .
sdk list java
sdk install java 8u152-zulu
sdk use java 8u152-zulu
Затем выполните чистую установку, как описано ниже.
При использовании Maven в качестве инструмента построения иногда полезно - и, как правило, приятно, сделать clean сборку установки с отключенным тестированием.
mvn clean install -DskipTests
Теперь, когда все построенный и установленный, вы можете продолжить и запустить тесты.
mvn test
Хотя возможно, что это связано с несоответствием пути к классам между временем компиляции и временем выполнения, это не обязательно верно.
Важно сохранить два или три разных исключения прямо в нашей голове в этот случай:
java.lang.ClassNotFoundException
Это исключение указывает, что класс не найден в пути к классам. Это указывает на то, что мы пытались загрузить определение класса, и класс не существовал в пути к классам. java.lang.NoClassDefFoundError
Это исключение указывает, что JVM посмотрел в своей внутренней структуре данных определения класса для определения класс и не нашел его. Это отличается от того, что он не может быть загружен из пути к классам. Обычно это указывает на то, что мы ранее пытались загрузить класс из пути к классам, но по какой-то причине он потерпел неудачу - теперь мы снова пытаемся использовать этот класс (и, следовательно, необходимо загрузить его, поскольку он провалился в последний раз) я даже не попытаюсь загрузить его, потому что мы не выполнили его загрузку ранее (и разумно подозреваем, что мы снова потерпим неудачу). Ранним отказом может быть исключение ClassNotFoundException или ExceptionInInitializerError (указывающее на отказ в статическом блоке инициализации) или любое количество других проблем. Дело в том, что NoClassDefFoundError не обязательно является проблемой класса. Error: Could not find or load main class
, он будет классифицирован под какой категорией ошибок?
– Vikram
19 July 2013 в 22:03
ClassCircularityError
и ClassFormatError
также могут возникать во время процесса загрузки: docs.oracle.com/javase/specs/jls/se5.0/html/…
– Pacerier
27 August 2014 в 03:52
Java не смог найти класс A во время выполнения. Класс A был в проекте Artline из maven из другого рабочего пространства. Поэтому я импортировал ArtClient в проект Eclipse. Два из моих проектов использовали ArtClient в качестве зависимости. Я изменил ссылку на библиотеку для ссылки на проект для этих (Путь сборки -> Настроить путь сборки).
И проблема исчезла.
Убедитесь, что это соответствует параметрам module:app
и module:lib
:
android {
compileSdkVersion 23
buildToolsVersion '22.0.1'
packagingOptions {
}
defaultConfig {
minSdkVersion 17
targetSdkVersion 23
versionCode 11
versionName "2.1"
}
NoClassDefFoundError
был фактически вызван ExceptionInInitalizerError
, который был вызван DateTimeParseException
). Это немного вводит в заблуждение, не так ли? Я знаю, что у них, вероятно, были причины сделать это так, но было бы неплохо иметь хотя бы небольшой намек, что NoClassDefFoundError
был результатом другого исключения, без необходимости его выводить. Еще раз бросать ExceptionInInitializerError
было бы намного яснее. Иногда связь между ними может быть не такой очевидной.
– Bartłomiej Zieliński
18 January 2016 в 10:41
{s
и два }
). Ты можешь починить это?
– Peter Mortensen
22 February 2018 в 16:30
Это наилучшее решение , которое я нашел до сих пор.
Предположим, что у нас есть пакет с именем org.mypackage
, содержащий классы:
и файлы, определяющие этот пакет, хранятся физически в каталоге D:\myprogram
(в Windows ) или /home/user/myprogram
(в Linux).
Структура файла будет выглядеть так:
Когда мы вызываем Java, мы указываем имя приложение для запуска: org.mypackage.HelloWorld
. Однако мы также должны сказать Java, где искать файлы и каталоги, определяющие наш пакет. Поэтому, чтобы запустить программу, мы должны использовать следующую команду:
Я обнаружил, что иногда я получаю ошибку NoClassDefFound, когда код компилируется с несовместимой версией класса, найденного во время выполнения. Конкретный экземпляр, о котором я помню, связан с библиотекой осей apache. Фактически на моем пути к классам среды исполнения было 2 версии, и она собирала устаревшую и несовместимую версию, а не правильную, вызывая ошибку NoClassDefFound. Это было в приложении командной строки, где я использовал команду, подобную этой.
set classpath=%classpath%;axis.jar
Мне удалось получить правильную версию, используя:
set classpath=axis.jar;%classpath%;
Если кто-то приходит сюда из-за ошибки java.lang.NoClassDefFoundError: org/apache/log4j/Logger
, в моем случае он был создан, потому что я использовал log4j 2 (но я не добавлял все файлы, которые поставляются вместе с ним), а также некоторая библиотека зависимостей log4j 1. решение заключалось в том, чтобы добавить мост Log4j 1.x: jar log4j-1.2-api-<version>.jar
, который поставляется с log4j 2. Дополнительная информация в log4j 2 migration .
Вот код, иллюстрирующий java.lang.NoClassDefFoundError
. Пожалуйста, см. ответ Джареда для подробного объяснения.
NoClassDefFoundErrorDemo.java
public class NoClassDefFoundErrorDemo {
public static void main(String[] args) {
try {
// The following line would throw ExceptionInInitializerError
SimpleCalculator calculator1 = new SimpleCalculator();
} catch (Throwable t) {
System.out.println(t);
}
// The following line would cause NoClassDefFoundError
SimpleCalculator calculator2 = new SimpleCalculator();
}
}
SimpleCalculator.java
public class SimpleCalculator {
static int undefined = 1 / 0;
}
Я получил это сообщение после удаления двух файлов из библиотеки SRC, и когда я вернул их, я продолжал видеть это сообщение об ошибке.
Мое решение было: Перезапустить Eclipse. С тех пор я еще не видел это сообщение: -)
NoClassDefFoundError
был фактически вызван ExceptionInInitalizerError
, который был вызван DateTimeParseException
). Это немного вводит в заблуждение, не так ли? Я знаю, что у них, вероятно, были причины сделать это так, но было бы неплохо иметь хотя бы небольшой намек, что NoClassDefFoundError
был результатом другого исключения, без необходимости его выводить. Еще раз бросать ExceptionInInitializerError
было бы намного яснее. Иногда связь между ними может быть не такой очевидной.
– Bartłomiej Zieliński
18 January 2016 в 10:41
mvn -X clean compiler package 2>&1 >test.log
, поэтому я мог видеть детали gory перед сообщением об ошибкеNoClassDefFound
. – Jesse Chisholm 4 May 2017 в 16:55