Я попробовал оба примера в Oracle Java 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);
}
}
Что я здесь не так делаю?
ОБНОВИТЬ
После того, как я поместил Main
класс в graphics
пакет (я добавил package graphics;
к нему), установил для classpath значение «_test» (папка с графикой), скомпилировал его и запустил с помощью java graphics.Main
(из командной строки), все заработало.
Действительно поздно ОБНОВЛЕНИЕ № 2
Я не использовал Eclipse (только Notepad ++ и JDK), и вышеприведенное обновление решило мою проблему. Тем не менее, кажется, что многие из этих ответов предназначены для Eclipse и IntelliJ, но имеют схожие концепции.
источник
package graphics;
наверху). Является лиgraphics
глава вашей структуры пакета? Квадрат имеетpackage graphics.shapes
наверху?Ответы:
После того, как вы скомпилируете свой код, вы получите
.class
файлы для каждого класса в вашей программе. Эти двоичные файлы являются байт-кодом, который Java интерпретирует для выполнения вашей программы.NoClassDefFoundError
Показывает , что загрузчик классов (в данном случаеjava.net.URLClassLoader
), который отвечает за классы динамически загрузки, не может найти.class
файл класса , который вы пытаетесь использовать.Ваш код не будет компилироваться, если требуемые классы отсутствуют (если классы не загружены с отражением), поэтому обычно это исключение означает, что ваш путь к классам не включает требуемые классы. Помните, что загрузчик классов (в частности
java.net.URLClassLoader
) будет искать классы в пакете abc в папке a / b / c / в каждой записи в вашем пути к классам.NoClassDefFoundError
также может указывать, что у вас отсутствует транзитивная зависимость файла .jar, с которым вы скомпилировали и пытаетесь использовать.Например, если у вас есть класс
com.example.Foo
, после компиляции у вас будет файл классаFoo.class
. Скажем, например, ваш рабочий каталог.../project/
. Этот файл класса должен быть размещен.../project/com/example
, и вы должны установить свой путь к классу.../project/
.Примечание: я бы порекомендовал воспользоваться удивительными инструментами, которые существуют для языков Java и JVM. Современные IDE, такие как Eclipse и IDEA, и инструменты управления сборкой, такие как Maven или Gradle, помогут вам не беспокоиться о путях к классам (а также о них) и сосредоточиться на коде! Тем не менее, эта ссылка объясняет, как установить путь к классу при выполнении в командной строке.
источник
Я хотел бы исправить точку зрения других на
NoClassDefFoundError
.NoClassDefFoundError
может произойти по нескольким причинам, таким какВ первоначальном вопросе это был первый случай, который можно исправить, установив CLASSPATH в файл jar ссылочных классов или в его папку пакета.
Что значит сказать «доступно во время компиляции»?
Например: два класса, A и B (расширяет A). Если B ссылается непосредственно на код, он доступен во время компиляции, то есть A a = new B ();
Что значит сказать «недоступно во время компиляции»?
Например: два класса, A и B (расширяет A). Код имеет
A a = Class.forName ("B"). NewInstance ();
источник
package app;
и перекомпилировать, прежде чем я смог переместить ее в приложение подкаталога.NoClassDefFoundError
для этого случая: archive.is/YPbYI#selection-2107.0-2115.13NoClassDefFoundError
означает, что класс присутствует в пути к классам вCompile time
, но он не существует в пути к классам вRuntime
.Если вы используете Eclipse, убедитесь, что у вас есть и
shapes
,linepoints
иspaceobjects
как записи в.classpath
файле.источник
если вы получили одну из этих ошибок при компиляции и запуске:
-------------------------- РЕШЕНИЕ -----------------------
проблема в основном в организации пакетов. Вы должны расположить ваши классы в папках должным образом в соответствии с классификациями пакетов в вашем исходном коде.
источник
указывает, что что-то было найдено во время компиляции, но не во время выполнения . возможно, вам просто нужно добавить его в путь к классам.
источник
Исключение определения класса не возникает, если предполагаемый класс не найден в пути к классам. Во время компиляции класс: класс был сгенерирован из компилятора Java, но каким-то образом во время выполнения зависимый класс не найден.
Давайте рассмотрим один простой пример:
}
Теперь давайте предположим, что вышеупомянутые два исходных кода Java размещены в некоторой папке, скажем, «NoClassDefinationFoundExceptionDemo»
Теперь откройте оболочку (при условии, что Java уже настроена правильно)
источник
NoClassDefFoundError в Java:
Определение:
NoClassDefFoundError возникнет, если класс присутствовал во время компиляции, но не был доступен в пути к классам Java во время выполнения. Обычно вы увидите строку ниже в журнале, когда получите NoClassDefFoundError: Исключение в потоке "main" java.lang.NoClassDefFoundError
Возможные причины:
Класс недоступен в Java Classpath.
Возможно, вы запускаете программу с помощью команды jar, а класс не определен в атрибуте ClassPath файла манифеста.
Любой сценарий запуска переопределяет переменную среды Classpath.
Поскольку NoClassDefFoundError является подклассом java.lang.LinkageError, он также может появиться, если одна из его зависимостей, такая как нативная библиотека, может быть недоступна.
Проверьте наличие java.lang.ExceptionInInitializerError в файле журнала. NoClassDefFoundError из-за сбоя статической инициализации встречается довольно часто.
Если вы работаете в среде J2EE, то видимость Class среди нескольких Classloader также может вызвать java.lang.NoClassDefFoundError, подробное обсуждение см. В разделе примеров и сценариев.
Возможные решения:
Убедитесь, что все необходимые классы Java включены в путь к классам приложения. Самая распространенная ошибка - не включать все необходимые классы перед началом выполнения приложения Java, которое зависит от некоторых внешних библиотек.
Путь к классу приложения правильный, но переменная среды Classpath переопределяется перед выполнением приложения.
Убедитесь, что вышеупомянутая ExceptionInInitializerError не отображается в трассировке стека вашего приложения.
Ресурсы:
3 способа решить java.lang.NoClassDefFoundError в Java J2EE
java.lang.NoClassDefFoundError - Как решить ошибку No Class Def Found Found
источник
Если ваш проект находится в пакете, как
com.blahcode
и ваш класс называетсяMain
, скомпилированные файлы могут быть выведены в структуре каталогов, как./out/com/blahcode/Main.class
. Это особенно верно для IntelliJ IDEA.При попытке запустить из оболочки или cmd, вам нужно перейти
cd
к тому, что содержитсяcom
в качестве подкаталога.источник
Проработав над проектом NetBeans в течение многих месяцев, я внезапно получил сообщение NoClassDefFoundError вскоре после получения предупреждения «Недостаточно памяти». Выполнение чистой перестройки не помогло, но при закрытии Netbeans и повторном открытии проекта не было сообщений об ошибках.
источник
Этот ответ относится к ошибке java.lang.NoClassDefFoundError, возникающей в службе :
Моя команда недавно увидела эту ошибку после обновления rpm, который предоставлял сервис. Rpm и программное обеспечение внутри него были созданы с Maven, поэтому казалось, что у нас была зависимость от времени компиляции, которая просто не была включена в rpm.
Однако при расследовании класс, который не был найден, находился в том же модуле, что и несколько классов в трассировке стека. Кроме того, это был не тот модуль, который был добавлен в сборку только недавно. Эти факты указывают на то, что это может не быть проблемой зависимости Maven.
Возможное решение: перезапустите сервис!
Похоже, что обновление rpm сделало недействительным дескриптор файла сервиса в базовом файле jar. Затем служба увидела класс, который не был загружен в память, искала его в своем списке дескрипторов jar-файлов и не смогла найти его, поскольку дескриптор файла, из которого он мог загрузить класс, был признан недействительным. Перезапуск службы заставил его перезагрузить все свои файловые дескрипторы, что позволило ему загрузить тот класс, который не был найден в памяти сразу после обновления rpm.
Надеюсь, что конкретный случай кому-то поможет.
источник
Я столкнулся с проблемой сегодня. У меня есть проект Android, и после его включения
multidex
проект больше не запускается.Причина была в том, что я забыл вызвать конкретный мультидексный метод, который должен быть добавлен в
Application class
и вызван перед всем остальным.Следуйте этому руководству, чтобы правильно включить мультидекс. https://developer.android.com/studio/build/multidex.html
Вы должны добавить эти строки в свой класс Application
источник
Для моего проекта проблема была в том, что браузер Chrome и chromedriver не были совместимы. У меня была очень старая версия драйвера, которая не могла даже открыть браузер. Я только что скачал последнюю версию и проблема решена. Как я обнаружил проблему? Поскольку я запускал свой проект, используя собственный драйвер Firefox Selenium со старой версией FF, встроенной в мое приложение, я понял, что проблема заключается в несовместимости браузера и драйвера.
Надеюсь, что это может помочь любому с такой же проблемой, как моя, которая генерировала это же сообщение об ошибке.
источник
Мои два цента в этой цепочке:
Убедитесь, что путь к классу содержит полные пути (
/home/user/lib/some_lib.jar
вместо~/lib/some_lib.jar
), в противном случае вы все равно можете столкнуться сNoClassDefFoundError
ошибкой.источник
~
и другие метасимволы оболочки при установке переменной окружения classpath, но только при условии, что механизм, который вы используете для установки переменной, расширяет их до реальных путей. Если вы используетеbash
, вы можете получить «смешанные» результаты. Например, посмотрите, что вы получаете при вводеecho ~:~
в командной строке. Первый~
расширен, а второй нет.Я получаю NoClassFoundError, когда классы, загруженные загрузчиком классов времени выполнения, не могут получить доступ к классам, уже загруженным загрузчиком Java. Поскольку разные загрузчики классов находятся в разных доменах безопасности (в соответствии с java), jvm не позволит разрешать классы, уже загруженные корневым загрузчиком, в адресном пространстве загрузчика времени выполнения.
Запустите вашу программу с помощью «java -javaagent: tracer.jar [ВАШИ java ARGS]»
Он производит вывод, показывающий загруженный класс и загрузчик env, который загрузил класс. Очень полезно отслеживать, почему класс не может быть решен.
источник
Это случилось со мной в Android Studio.
Решение, которое сработало для меня: просто перезапустите студию.
источник
У меня была такая же проблема с моей разработкой Android с использованием Android studio. Предоставленные решения являются общими и не помогли мне (по крайней мере, для меня). После нескольких часов исследований я нашел следующее решение и может помочь разработчикам Android, которые занимаются разработкой с использованием Android Studio. измените настройку, как показано ниже: «Настройки» -> «Сборка», «Выполнение», «Развертывание» -> «Мгновенный запуск» -> снимите флажок с первого параметра.
С этим изменением я в порядке. Надеюсь, это поможет моим друзьям.
источник
Одним из источников ошибок для этого исключения может быть несовместимое определение Proguard, например, отсутствие
-libraryJars "path.to.a.missing.jar.library".
Это объясняет, почему компиляция и запуск работают нормально, учитывая, что jar есть, а clean & build завершается неудачно. Не забудьте определить новые добавленные библиотеки jar в настройках Proguard!
Обратите внимание, что сообщения об ошибках от Proguard на самом деле не соответствуют стандарту, так как их легко спутать с аналогичными сообщениями муравья, которые приходят, когда банка вообще нет. Только в самом низу будет небольшой намек на беду. Следовательно, вполне логично начать поиск традиционных ошибок пути к классам и т. Д., Но это будет напрасно.
Очевидно, что исключение NoClassDefFound будет результатом при запуске, например, созданного в результате исполняемого файла jar, созданного на основе отсутствия согласованности proguard. Некоторые называют это Proguard "Ад"
источник
Я использую плагин FileSync для Eclipse, чтобы я мог выполнять отладку в режиме реального времени на Tomcat, и я получил,
NoClassFoundError
потому что я добавил запись синхронизации дляbin
каталога в рабочую область Eclipse=> classes
вmetadata
for для Tomcat, но также не добавил синхронизацию папок дляextlib
каталога в Eclipse.=>
C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib
источник
Я разрабатываю приложение на основе Eclipse, также известное как RCP (Rich Client Platform) . И я столкнулся с этой проблемой после рефакторинга (перевод одного класса из плагина в новый).
Очистка проекта и обновление Maven не помогли.
Проблема была вызвана активатором пакета, который не обновлялся автоматически. Ручное обновление Bundle-Activator в MANIFEST.MF в новом плагине устранило мою проблему.
источник
Если вы недавно добавили поддержку мультидекса в Android Studio, как это:
так что ваше решение просто расширяется от MultiDexApplication вместо Application
источник
Если вы используете более одного модуля, вы должны иметь
в вашем файле сборки.
источник
Проверьте это, если у вас есть статический обработчик в вашем классе. Если это так, пожалуйста, будьте осторожны, потому что статический обработчик может быть запущен только в потоке с петлителем, сбой может быть вызван следующим образом:
1. Во-первых, создайте экземпляр класса в простом потоке и поймайте сбой.
2. затем вызовите метод поля Class в главном потоке, вы получите NoClassDefFoundError.
вот тестовый код:
в вашем методе onCrete Основной операции добавьте часть кода теста:
Есть простой способ исправить это, используя handlerThread для инициализации обработчика:
источник
Не используйте тестовые классы вне модуля
У меня нет решения, просто еще один вариант случая «присутствует при компиляции, отсутствует во время выполнения».
Я пытался использовать очень удобный метод из тестового класса JUnit из другого тестового класса, который находится в другом модуле. Это нет-нет, так как тестовый код не является частью упакованного jar, но я не понял, потому что он кажется видимым для пользовательского класса из Eclipse.
Моим решением было поместить метод в существующий класс утилит, который является частью производственного кода.
источник
В моей среде я сталкиваюсь с этой проблемой в модульном тестировании. После добавления одной библиотечной зависимости в * .pom это исправлено.
например:
сообщение об ошибке:
П:
источник
Я получил эту ошибку после изменения ветки Git. Для конкретного случая Eclipse в каталоге .settings были пропущенные строки для файла org.eclipse.wst.common.component. Как вы можете видеть ниже
Восстановление зависимостей проекта с помощью Maven Install поможет.
источник
если вы используете
gradlew
, перейдите к правильной версии Gradle./gradle/wrapper/gradle-wrapper.properties
и перейдитеdistributionUrl
на нее.Если вы используете JDK14, попробуйте
источник
Это часто случается с моими устройствами genymotion. Убедитесь, что на диске, где установлен Genymotion, имеется достаточно свободного места.
источник