Как решить java.lang.NoClassDefFoundError?

Я пробовал использовать оба примера в Oracle Tutorials . Они оба компилируются хорошо, но во время выполнения оба варианта приходят с этой ошибкой:

Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square at Main.main(Main.java:7) Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more 

Я думаю, у меня может быть файл Main.java в неправильной папке. Вот иерархия каталогов:

 graphics ├ Main.java ├ shapes | ├ Square.java | ├ Triangle.java ├ linepoint | ├ Line.java | ├ Point.java ├ spaceobjects | ├ Cube.java | ├ RectPrism.java 

И вот Main.java :

 import graphics.shapes.*; import graphics.linepoint.* import graphics.spaceobjects.*; public class Main { public static void main(String args[]) { Square s = new Square(2,3,15); Line l = new Line(1,5,2,3); Cube c = new Cube(13,32,22); } } 

Что я здесь делаю неправильно?

ОБНОВИТЬ

После того, как я поместил class Main в graphics пакет (я добавил package graphics; к нему), задайте путь к classу «_test» (папку, содержащую графику), скомпилировали его и запустили с помощью java graphics.Main Основная часть (из командной строки ), это сработало.

Действительно поздно UPDATE # 2

Я не использовал Eclipse (только Notepad ++ и JDK), и вышеупомянутое обновление решило мою проблему. Однако, похоже, что многие из этих ответов для Eclipse и IntelliJ, но у них есть аналогичные концепции.

23 Solutions collect form web for “Как решить java.lang.NoClassDefFoundError?”

После компиляции кода вы .class файлы .class для каждого classа вашей программы. Эти двоичные файлы – это байт-код, который Java интерпретирует для выполнения вашей программы. NoClassDefFoundError указывает, что загрузчик classов (в данном случае java.net.URLClassLoader ), который отвечает за динамическую загрузку classов, не может найти файл .class для classа, который вы пытаетесь использовать.

Ваш код не будет компилироваться, если требуемые classы не присутствуют (если classы не загружены с reflectionм), поэтому обычно это исключение означает, что ваш путь к classу не включает необходимые classы. Помните, что classloader (в частности, java.net.URLClassLoader ) будет искать classы в пакете abc в папке a / b / c / в каждой записи в вашем пути к classам. NoClassDefFoundError также может указывать на то, что вам не хватает транзитивной зависимости файла .jar, который вы скомпилировали, и пытаетесь использовать.

Например, если у вас был class com.example.Foo , после компиляции у вас будет файл classа Foo.class . Скажем, например, ваш рабочий каталог .../project/ . Этот файл classа должен быть помещен в .../project/com/example , и вы должны установить свой путь к classу .../project/ .

Боковое замечание: я бы рекомендовал воспользоваться удивительным инструментом, который существует для языков Java и JVM. Современные средства IDE, такие как Eclipse и IDEA, и инструменты управления построением, такие как Maven или Gradle, помогут вам не беспокоиться о classpaths (столько же) и сосредоточиться на коде! Тем не менее, эта ссылка объясняет, как установить путь к classу при выполнении в командной строке.

Я хотел бы исправить NoClassDefFoundError других о NoClassDefFoundError .

NoClassDefFoundError может возникать по нескольким причинам, таким как

  1. ClassNotFoundException – .class не найден для этого ссылочного classа независимо от того, доступен ли он во время компиляции или нет (т.е. базовый / дочерний class).
  2. Файл classа находится, но исключение возникает при инициализации статических переменных
  3. Файл classа расположен, Исключение, возникающее при инициализации статических блоков

В исходном вопросе это был первый случай, который можно исправить, установив CLASSPATH в файл jar-файлов ссылок или в его папку пакета.

Что это означает, говоря «доступно во время компиляции»?

  • В коде используется ссылочный class.
    Например: два classа, A и B (расширяет A). Если B ссылается непосредственно в коде, он доступен во время компиляции, то есть A a = new B ();

Что это означает, говоря «не доступно во время компиляции»?

  • Класс времени компиляции и class времени выполнения различны, т. Е. Например, базовый class загружается с использованием имени classа дочернего classа, например Class.forName («classname»)
    Например: два classа, A и B (расширяет A). Код имеет
    A a = Class.forName (“B”). NewInstance ();

NoClassDefFoundError означает, что class присутствует в пути к classам во Compile time , но он отсутствует в пути к classам в Runtime .

Если вы используете Eclipse, убедитесь, что у вас есть shapes , linepoints и spaceobjects как записи в файле .classpath .

если вы получили одну из этих ошибок при компиляции и запуске:

  • NoClassDefFoundError

  • Ошибка: не удалось найти или загрузить приветствие основного classа

  • Исключение в streamе «main» java.lang.NoClassDefFoundError: javaTest / test / hello (неправильное имя: test / hello) в java.lang.ClassLoader.defineClass1 (собственный метод) в java.lang.ClassLoader.defineClass (Неизвестный источник) в java.security.SecureClassLoader.defineClass (Неизвестный источник) в java.net.URLClassLoader.defineClass (Неизвестный источник) в java.net.URLClassLoader.access $ 100 (Неизвестный источник) в java.net.URLClassLoader $ 1.run (Неизвестный источник) в java.net.URLClassLoader $ 1.run (Неизвестный источник) в java.security.AccessController.doPrivileged (собственный метод) в java.net.URLClassLoader.findClass (Неизвестный источник) в java.lang.ClassLoader.loadClass (Неизвестный источник) на солнце .misc.Launcher $ AppClassLoader.loadClass (Неизвестный источник) в java.lang.ClassLoader.loadClass (Неизвестный источник) на sun.launcher.LauncherHelper.checkAndLoadMain (Неизвестный источник)

————————– РЕШЕНИЕ ———————–

проблема в основном связана с пакетами orgnization. Вы должны правильно упорядочить свои classы в папках в соответствии с classификациями пакетов в исходном коде.

 On Compiling process use this command: javac -d . [FileName.java] To Run the class please use this command: java [Package].[ClassName] 
 java.lang.NoClassDefFoundError 

указывает, что что-то было найдено в compiletime, но не во время выполнения . возможно, вам просто нужно добавить его в classpath.

Отсутствие определения classа. Исключение происходит, когда целевой class не найден в пути classа. В classе времени компиляции: class был сгенерирован из компилятора Java, но каким-то образом во время выполнения зависимый class не найден.

Пройдем один простой пример:

 public class ClassA{ public static void main(String args[]){ //Some gibberish Code... String text = ClassB.getString(); System.out.println("Text is :" + text); } 

}

 public class ClassB{ public static String getString(){ return "Testing Some Exception"; } } 

Теперь Предположим, что вышеупомянутые два исходных кода Java помещены в какую-либо папку, можно сказать, что «NoClassDefinationFoundExceptionDemo»

Теперь откройте оболочку (предположим, что Java уже настроена правильно)

  1. Перейдите в папку «NoClassDefinationFoundExceptionDemo»
  2. Компилировать исходные файлы Java javac ClassB javac ClassA
  3. Оба файла скомпилированы. Существенно и сгенерированные файлы classов в той же папке, что и ClassA.class и ClassB.class
  4. Теперь, поскольку мы переопределяем ClassPath в текущий рабочий каталог, поэтому мы выполняем следующую команду java -cp. ClassA и он работал успешно, и вы увидите вывод на экране
  5. Теперь скажем, вы удалили файл ClassB.class из Current Directory. и теперь вы снова выполняете команду. java -cp. ClassA Теперь он будет приветствовать вас с NoClassDefFoundException. поскольку ClassB, который является зависимостью для ClassA, не найден в пути к classам (т.е. существующем рабочем каталоге).

NoClassDefFoundError в Java:

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

NoClassDefFoundError появится, если class присутствовал во время компиляции, но не доступен в java classpath во время выполнения. Обычно вы увидите строку ниже в журнале, когда вы получаете NoClassDefFoundError: Исключение в streamе «main» java.lang.NoClassDefFoundError

Возможные причины:

  1. Класс недоступен в Java Classpath.

  2. Возможно, вы запускаете свою программу с помощью команды jar, и class не был определен в атрибуте ClassPath файла манифеста.

  3. Любой стартовый скрипт переопределяет переменную среды Classpath.

  4. Поскольку NoClassDefFoundError является подclassом java.lang.LinkageError, он также может появиться, если некоторая его зависимость, например, родная библиотека, недоступна.

  5. Проверьте java.lang.ExceptionInInitializerError в вашем файле журнала. NoClassDefFoundError из-за сбоя статической инициализации довольно распространен.

  6. Если вы работаете в среде J2EE, чем видимость classа среди нескольких Classloader также может вызвать java.lang.NoClassDefFoundError, см. Примеры и сценарий для подробного обсуждения.

Возможные Резолюции:

  1. Убедитесь, что все необходимые classы Java включены в путь к classам приложения. Наиболее распространенная ошибка заключается не в том, чтобы включать все необходимые classы, прежде чем приступать к выполнению приложения Java, которое имеет зависимости от некоторых внешних библиотек.

  2. Путь к classу приложения верен, но переменная среды Classpath переопределяется перед выполнением приложения.

  3. Убедитесь, что вышеупомянутый ExceptionInInitializerError не отображается в трассировке стека приложения.

Ресурсы:

3 способа решения java.lang.NoClassDefFoundError в Java J2EE

java.lang.NoClassDefFoundError – Как решить проблему определения не найденной степени

Если ваш проект находится в пакете com.blahcode а ваш class называется Main , скомпилированные файлы могут выводиться в структуре каталогов, например ./out/com/blahcode/Main.class . Это особенно справедливо для IntelliJ IDEA.

При попытке запустить из оболочки или cmd вам нужно cd к тому, что содержит com как подкаталог.

 cd out java -classpath . com.blahcode.Main 

Сегодня я столкнулся с проблемой. У меня есть проект Android, и после включения multidex проект больше не запускается.

Причина заключалась в том, что я забыл вызвать конкретный метод multidex, который должен быть добавлен в Application class и вызываться перед всем остальным.

  MultiDex.install(this); 

Следуйте этому руководству, чтобы правильно включить multidex. https://developer.android.com/studio/build/multidex.html

Вы должны добавить эти строки в свой class приложения

  @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } 

После работы над проектом NetBeans в течение многих месяцев я неожиданно получил сообщение NoClassDefFoundError вскоре после получения предупреждения «Низкая память». Выполнение чистых перестроек не помогло, но полностью закрыло Netbeans и вновь открыло проект, и никаких отчетов об ошибках не было.

Этот ответ специфичен для java.lang.NoClassDefFoundError, который происходит в службе :

Моя команда недавно увидела эту ошибку после обновления rpm, которая предоставляла сервис. Rpm и программное обеспечение внутри него были построены с Maven, поэтому казалось, что у нас была зависимость времени компиляции, которая просто не была включена в число оборотов в минуту.

Однако при исследовании class, который не был найден, находился в том же модуле, что и несколько classов в трассировке стека. Кроме того, это был не модуль, который недавно был добавлен в сборку. Эти факты указывают на то, что это не может быть проблемой зависимости Maven.

Возможное решение: перезапустите службу!

Похоже, что обновление rpm аннулирует дескриптор файла службы в базовом файле jar. Затем служба увидела class, который не был загружен в память, искал его среди своего списка файлов jar-файлов и не смог найти его, потому что дескриптор файла, из которого он мог загрузить class, был недействителен. Перезапуск службы заставил ее перезагрузить все свои файлы, что позволило загрузить этот class, который не был найден в памяти сразу после обновления rpm.

Надеюсь, что конкретный случай помогает кому-то.

Мои две цента в этой цепочке:

Убедитесь, что путь к /home/user/lib/some_lib.jar содержит полные пути ( /home/user/lib/some_lib.jar вместо ~/lib/some_lib.jar ), иначе вы все равно можете столкнуться с NoClassDefFoundError error.

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

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

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

 // 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; } }); } } 

Это случается очень часто с моими модулями genymotion. Убедитесь, что на вашем диске имеется достаточное количество памяти, где установлен Genymotion.

Это случилось со мной в Android Studio.

Решение, которое сработало для меня: просто перезапустите студию.

У меня была такая же проблема с разработкой Android с помощью студии Android. Предлагаемые решения являются общими и мне не помогают (по крайней мере, для меня). После нескольких часов исследований я нашел следующее решение и может помочь разработчикам Android, которые занимаются разработкой с помощью студии Android. измените настройку, как показано ниже. Настройки -> Сборка, выполнение, развертывание -> Мгновенный запуск -> отменить первый вариант.

С этим изменением я работаю. Надеюсь, это поможет моим друзьям-друзьям.

убедитесь, что если у вас есть статический обработчик в вашем classе, если это так, PLS удалить его или изменить свой код, заставить статический обработчик можно инициировать только в основном streamе, авария может быть вызвана следующим образом:

1. сначала создайте экземпляр classа в не основной теме и поймайте сбой.

2. Затем вызовите метод поля classа в основном streamе, вы получите NoClassDefFoundError.

вот тестовый код:

 public class MyClass{ private static Handler mHandler = new Handler(); public static int num = 0; 

}

в вашем методе onCrete основной активности добавьте часть тестового кода:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //test code start new Thread(new Runnable() { @Override public void run() { try { MyClass myClass = new MyClass(); } catch (Throwable e) { e.printStackTrace(); } } }).start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } MyClass.num = 3; // end of test code } 

существует простой способ исправить его с помощью обработчика handlerThread для init:

 private static Handler mHandler; private static HandlerThread handlerThread = new HandlerThread("newthread"); static { handlerThread.start(); mHandler = new Handler(handlerThread.getLooper(), mHandlerCB); } 

Если вы используете более одного модуля, вы должны иметь

dexOptions { preDexLibraries = false }

в вашем файле сборки.

Одним из источников ошибок для этого исключения может быть несовместимое определение Proguard, например, отсутствие

-libraryJars “path.to.a.missing.jar.library”.

Это объясняет, почему компиляция и работа отлично работают, учитывая, что банку есть, а clean & build терпит неудачу. Не забудьте определить новые добавленные библиотеки jar в настройках proguard!

Обратите внимание, что сообщения об ошибках от Proguard действительно не соответствуют стандарту, так как их легко путать с похожими сообщениями ant, поступающими, когда банку вообще нет. Только на самом дне будет небольшой намек на prologа в беде. Следовательно, вполне логично начинать поиск традиционных ошибок classpath и т. Д., Но это будет напрасно.

Очевидно, исключение NoClassDefFound будет результатом при запуске, например, в результате создания исполняемого jar-файла и на основе отсутствия последовательности proguard. Некоторые называют это prologа «Ад»,

Я использую плагин FileSync для Eclipse, поэтому я могу отлаживать Tomcat & I, получив NoClassFoundError потому что я добавил запись синхронизации для каталога bin в => classes Eclipse workspace => classes в metadata для Tomcat, но не добавил также синхронизацию с папками для каталога extlib в Eclipse =>

C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib

1) Первый метод: я решил эту проблему. Удалив некоторый class Dependencies, удалите их из ниже кода, эту проблему я столкнулся с 4.2.2

 compile 'com.google.android.gms:play-services-gcm:11.0.4' compile 'com.google.android.gms:play-services:11.0.4' 

они лишние в моем коде, я удалил их

  dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile files('libs/ypylibs.jar') compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.google.android.gms:play-services-gcm:11.0.4' compile 'com.google.android.gms:play-services:11.0.4' compile 'com.google.android.gms:play-services-ads:11.0.4' compile 'com.dailymotion.dailymotion-sdk-android:sdk:0.1.12' compile 'org.apache.httpcomponents:httpcore:4.4.1' compile 'commons-io:commons-io:1.3.2' compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2' compile 'com.android.support:multidex:1.0.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' 

} (2) Метод: Еще один способ решить эту проблему – создать новый class Myapplication

 public class MyApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } 

}

затем добавьте его в файл mainfest и в тег приложения

   

после этого в вашем основном действии удалите appcompactactivity, если это необходимо, и расширьте свой class активностью, тогда он будет работать.

Я разрабатываю приложение на основе Eclipse, также известное как RCP (Rich Client Platform) . И я столкнулся с этой проблемой после рефакторинга (перемещение одного classа из подключаемого модуля в новый).

Очистка проекта и обновление Maven не помогли.

Проблема была вызвана Bundle-Activator, которые не обновлялись автоматически. Ручное обновление Bundle-Activator под MANIFEST.MF в новом подключаемом модуле устранило мою проблему.

если вы недавно добавили поддержку multidex в студию Android, вот так:

 // To Support MultiDex implementation 'com.android.support:multidex:1.0.1' 

поэтому ваше решение просто расширяется из MultiDexApplication вместо приложения

 public class MyApp extends MultiDexApplication { 
Interesting Posts
Давайте будем гением компьютера.