Java lang noclassdeffounderror windows

Как исправить ошибку java.lang.NoClassDefFoundError в Java J2EE

Я потратил довольно много времени, чтобы выяснить как исправить ошибку java.lang.NoClassDefFoundError в Java.

В этой инструкции я покажу как исправить эти ошибки, раскрою некоторые секреты NoClassDefFoundError и поделюсь своим опытом в этой области.

NoClassDefFoundError — это самая распространенная ошибка в разработке Java. В любом случае, давайте посмотрим, почему это происходит и что нужно сделать для разрешения проблемы.

Разбираемся с причинами noclassdeffounderror в Java

NoClassDefFoundError в Java возникает, когда виртуальная машина Java не может найти определенный класс во время выполнения, который был доступен во время компиляции.

Например, если у нас есть вызов метода из класса или доступ к любому статическому члену класса, и этот класс недоступен во время выполнения, JVM сгенерирует NoClassDefFoundError.

Важно понимать, что это отличается от ClassNotFoundException, который появляется при попытке загрузить класс только во время выполнения, а имя было предоставлено во время выполнения, а не во время компиляции. Многие Java-разработчики смешивают эти две ошибки и запутываются.

NoClassDefFoundError возникнет, если класс присутствовал во время компиляции, но не был доступен в java classpath во время выполнения. Обычно появляется такая ошибка:

Разница между java.lang.NoClassDefFoundError и ClassNotFoundException в Java

java.lang.ClassNotFoundException и java.lang.NoClassDefFoundError оба связаны с Java Classpath, и они полностью отличаются друг от друга.

ClassNotFoundException возникает, когда JVM пытается загрузить класс во время выполнения, т.е. вы даете имя класса во время выполнения, а затем JVM пытается загрузить его, и если этот класс не найден, он генерирует исключение java.lang.ClassNotFoundException.

Тогда как в случае NoClassDefFoundError проблемный класс присутствовал во время компиляции, и поэтому программа успешно скомпилирована, но не доступна во время выполнения по любой причине.

Приступим к решению ошибки java.lang.NoClassDefFoundError.

Нам нужно добавить NoClassDefFoundError в Classpath или проверить, почему он не доступен в Classpath. Там может быть несколько причин, таких как:

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

Примеры

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

NoClassDefFoundError в Java из-за исключения в блоке инициализатора

Это еще одна распространенная причина java.lang.NoClassDefFoundError, когда ваш класс выполняет некоторую инициализацию в статическом блоке и если статический блок генерирует исключение, класс, который ссылается на этот класс, получит NoclassDefFoundError.

Смотрите в журнале java.lang.ExceptionInInitializerError, потому что это может вызвать java.lang.NoClassDefFoundError: Could not initialize class.

Как и в следующем примере кода, во время загрузки и инициализации класса, пользовательский класс генерирует Exception из статического блока инициализатора, который вызывает ExceptionInInitializerError при первой загрузке пользовательского класса в ответ на новый вызов User ().

Error occurred during initialization of VM (java/lang/NoClassDefFoundError: java/lang/Object)

I’m trying to install Java to use Eclipse (I followed all instructions to install Java and Eclipse) but my Eclipse is not starting due to some bad configuration I guess. I can’t figure out why it’s not working for me.

Eclipse Installation:

  1. Extracted Eclipse at C:\eclipse
  2. Created a shortcut to my desktop having target C:\eclipse\eclipse.exe

When I try to run Eclipse with this shortcut, I see following Eclipse splash screen for a second and it disappears. Eclipse does not start at all.

JAVA Installation:

  1. Installed JDK at C:\Program Files\Java\jdk1.7.0_10
  2. Installed JRE at C:\Program Files\Java\jre7

Environment Variables Configuration:

I tested my Java installation using the console and figured out this issue but I don’t know how to fix it, and I guess this is causing Eclipse not to start.

Problem:

11 Answers 11

Go to Eclipse folder, locate eclipse.ini file, add following entry (before -vmargs if present):

Save file and execute eclipse.exe.

please try to execute java from

i.e from the location where java is installed.

If it is successful, it means that the error lies somewhere in the classpath.

Also, this guy seems to have had the same problem as yours, check it out

Check that downloaded eclipse/JDK/JRE is compatible with your processor/OS architecture that is are they 32bit or 64bit?

I used Jdk 1.8 and JRE 1.8 , Classpath is also set properly but I observed that Java command gives Error to initialization of VM ( java/lang/NoClassDefFoundError: java/lang/Object)

Try placing the desired java directory in PATH before not needed java directories in your PATH.

I had the same error in my case was when I needed to update jdk 7 to jdk 8, and my bad was just I installed jdk8 and I never installed jre8, only that, the error was solved immediately when I installed jre8.

I had the same issue on Windows 7 and I had to install both JDK and JRE and it’s a success.

I faced the same problem,Eclipse splash screen for a second and it disappears.Then i noticed due to auto update of java there are two java version installed in my system. when i uninstalled one eclipse started working.

I just spent about 1 hour to figure out possible solution for the same error.

So what I did under MS WIndows 7 is following

Uninstall all Java packages of all versions.

Download last packages Java SE or JRE for your 32 or 64 Windows and install it.

Читайте также:  Linux upgrade all packages

First install JRE and second is Java SE.

Open text editor and paste this code.

public class Hello <

Save it like Hello.java

Go to Console and compile it like

Should be no error.

sometime you missed some file like I missed my one file rt.java so better to check yours .

I’ve observed this with STS and Eclipse and running java from CMD too on Windows 7/8/10 and following was my simple solution:

Actually, when I installed JDK 8 and STS/Eclipse it created one directory i.e. C:\ProgramData\Oracle\Java\javapath with the following files:

  • C:\ProgramData\Oracle\Java\javapath\java.exe
  • C:\ProgramData\Oracle\Java\javapath\javaw.exe
  • C:\ProgramData\Oracle\Java\javapath\javaws.exe

Along with that, it appended Path Environment variable of System with this location C:\ProgramData\Oracle\Java\javapath

NoClassDefFoundError while running from jar

I am getting a «no class definition found» exception while trying to run my application on Windows (it runs fine on OS X). The classes the JVM is complaining about are my classes (no third party jars required). When I unzip the files inside the jar, all files are present, including the ones the JVMm is complaining about.

The jar is created using the following task:

I cannot figure out what is causing the problem. If I unzip the jar and run the jar from the directory I unzipped the class to, everything works fine. So, I am assuming all the required files are inside the jar.

EDIT: com.hamza.driver.ui is a class in a package called com.hamza.driver which has main .

After the build, I get one jar «app.jar», and I run it using «java -jar app.jar», which executes fine on OS X, but not on Windows.

If I unzip app.jar in a seperate directory and run «java -jar app.jar», it excutes fine.

EDIT 2: exception:

ClipboardTransferHandle .class files are present in the jar.

EDIT 3: imports for the clip board class:

While playing with it, I found that if I try to declare ClipboardTransferHandle as a static variable in the driver, it works, but every object that is not static is not found. All the main GUI elements are static variables, so the GUI is constructed, but other elements are not; everything that is created not static causes NoClassDefFound , but if I declare them static for testing, they work.

java.lang.NoClassDefFoundError: Как решить — Часть 3

Будет предоставлен образец Java-программы, и я призываю вас скомпилировать и запустить этот пример с вашей рабочей станции, чтобы правильно воспроизвести и понять этот тип проблемы NoClassDefFoundError.

Пересмотрен статический инициализатор Java

Язык программирования Java предоставляет вам возможность «статически» инициализировать переменные или блок кода. Это достигается с помощью «статического» идентификатора переменной или использования статического блока <> в заголовке класса Java. Статические инициализаторы гарантированно выполняются только один раз в жизненном цикле JVM и являются поточно-ориентированными по своей конструкции, что делает их использование весьма привлекательным для инициализации статических данных, таких как внутренние кэши объектов, средства ведения журнала и т. Д.

В чем проблема? Я повторю еще раз, статические инициализаторы гарантированно будут выполняться только один раз в жизненном цикле JVM… Это означает, что такой код выполняется во время загрузки класса и никогда не будет выполняться снова, пока вы не перезапустите JVM. Что произойдет, если код, выполненный в это время (время загрузки @Class), завершится необработанным исключением?

Читайте также:  Eve ng linux images

Добро пожаловать в проблемный случай java.lang.NoClassDefFoundError # 2!

Проблема NoClassDefFoundError, вариант 2 — статическая ошибка инициализатора

Проблема такого типа возникает после сбоя статического кода инициализатора в сочетании с последовательными попытками создания нового экземпляра затронутого (незагруженного) класса.

Пример Java-программы

Следующая простая Java-программа разделена, как показано ниже:

— Основная Java-программа NoClassDefFoundErrorSimulator
— Уязвимый класс Java ClassA
— ClassA предоставляет вам переключатель ON / OFF, позволяющий вам воспроизвести тип проблемы, которую вы хотите изучить

Эта программа просто пытается создать новый экземпляр ClassA 3 раза (один за другим). Он продемонстрирует, что первоначальный сбой статической переменной или инициализатора статического блока в сочетании с последовательной попыткой создания нового экземпляра затронутого класса вызывает триггеры java.lang.NoClassDefFoundError.

Проблема воспроизведения

Чтобы повторить проблему, мы просто «добровольно» вызовем сбой статического кода инициализатора. Пожалуйста, просто включите тип проблемы, которую вы хотите изучить, например, ошибка статической переменной или статического блока:

Теперь давайте запустим программу с обоими переключателями в положении OFF (оба логических значения в false)
## Базовая линия (нормальное исполнение)

Для начального запуска (базовый уровень) основная программа смогла успешно создать 3 экземпляра ClassA без проблем.

## Запуск воспроизведения проблемы (ошибка инициализатора статической переменной)

## Запуск воспроизведения проблемы (ошибка инициализатора статического блока)

Что произошло? Как вы можете видеть, первая попытка создать новый экземпляр ClassA инициировала java.lang.ExceptionInInitializerError. Это исключение указывает на сбой нашего статического инициализатора для нашей статической переменной & блока, что именно то, что мы хотели достичь.

Ключевой момент, который необходимо понять, заключается в том, что этот сбой предотвратил загрузку всего класса ClassA. Как вы можете видеть, попытка № 2 и попытка № 3 сгенерировали java.lang.NoClassDefFoundError, почему? Ну, так как первая попытка не удалась, загрузка класса ClassA была предотвращена. Последовательные попытки создать новый экземпляр ClassA в текущем ClassLoader действительно генерировали java.lang.NoClassDefFoundError снова и снова, поскольку ClassA не был найден в текущем ClassLoader.

Как вы можете видеть, в этом контексте проблемы NoClassDefFoundError — это просто симптом или следствие другой проблемы. Первоначальная проблема — это ExceptionInInitializerError, срабатывающая после сбоя статического кода инициализатора. Это ясно демонстрирует важность правильной обработки ошибок и ведения журнала при использовании статических инициализаторов Java.

Рекомендации и стратегии решения

Теперь найдите ниже мои рекомендации и стратегии решения для проблемы 2 проблемы NoClassDefFoundError:
— Просмотрите ошибку java.lang.NoClassDefFoundError и определите отсутствующий класс Java.
— Выполните пошаговое выполнение кода для затронутого класса и определите, содержит ли он статический код инициализатора (переменные и статический блок)
— Просмотрите журналы сервера и приложения и определите, возникла ли какая-либо ошибка (например, ExceptionInInitializerError) из кода статического инициализатора. — После подтверждения проанализируйте код еще раз и определите основную причину сбоя кода инициализатора. Возможно, вам придется добавить некоторые дополнительные журналы вместе с надлежащей обработкой ошибок, чтобы предотвратить и лучше обрабатывать будущие сбои вашего кода статического инициализатора в будущем.

Пожалуйста, не стесняйтесь оставлять любые вопросы или комментарии.

Часть 4 начнет рассмотрение проблем NoClassDefFoundError, связанных с проблемами загрузчика классов.

Оцените статью