Java lang noclassdeffounderror как исправить
Перейти к содержимому

Java lang noclassdeffounderror как исправить

  • автор:

Почему возникает java.lang.NoClassDefFoundError?

run: Exception in thread «main» java.lang.NoClassDefFoundError: org/apache/http/HttpEntity at com.github.sardine.SardineFactory.begin(SardineFactory.java:44) at com.github.sardine.SardineFactory.begin(SardineFactory.java:34) at javaapplication.JavaApplication.main(JavaApplication.java:25) Caused by: java.lang.ClassNotFoundException: org.apache.http.HttpEntity at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) . 3 more C:\Users\Levchenko\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1

Подскажите, пожалуйста, почему возникает ошибка. Возможно, я подключил не все библиотеки которые нужны. Добавил библиотеки. В структуре проекта теперь 3 библиотеки: sardine, httpclient, http core. Вот что получилось:

Exception in thread «main» java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at org.apache.http.conn.ssl.AbstractVerifier.(AbstractVerifier.java:61) at org.apache.http.conn.ssl.AllowAllHostnameVerifier.(AllowAllHostnameVerifier.java:44) at org.apache.http.conn.ssl.AllowAllHostnameVerifier.(AllowAllHostnameVerifier.java:46) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.(SSLConnectionSocketFactory.java:146) at com.github.sardine.impl.SardineImpl.createDefaultSecureSocketFactory(SardineImpl.java:1116) at com.github.sardine.impl.SardineImpl.createDefaultSchemeRegistry(SardineImpl.java:1099) at com.github.sardine.impl.SardineImpl.configure(SardineImpl.java:1064) at com.github.sardine.impl.SardineImpl.(SardineImpl.java:203) at com.github.sardine.SardineFactory.begin(SardineFactory.java:44) at com.github.sardine.SardineFactory.begin(SardineFactory.java:34) at javaapplication.JavaApplication.main(JavaApplication.java:25) Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) . 11 more C:\Users\Levchenko\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1

Ошибка: Exception in thread “main” java

Если вы сталкивались с ошибками Exception in thread “main”, то в этой статье я расскажу что это значит и как исправить ее на примерах.

При работе в среде Java, типа Eclipse или Netbeans, для запуска java-программы, пользователь может не столкнуться с этой проблемой, потому что в этих средах предусмотрен качественный запуск с правильным синтаксисом и правильной командой.

Здесь мы рассмотрим несколько общих java-исключений(Exceptions) в основных исключениях потоков, которые вы можете наблюдать при запуске java-программы с терминала.

java.lang.UnsupportedClassVersionError ошибка в Java

Исключение в потоке java.lang.UnsupportedClassVersionError

Это исключение происходит, когда ваш класс java компилируется из другой версии JDK и вы пытаетесь запустить его из другой версии java. Рассмотрим это на простом примере:

package com.journaldev.util; public class ExceptionInMain < public static void main() < System.out.println(10); >>

Когда создаётся проект в Eclipse, он поддерживает версию JRE, как в Java 7, но установлен терминал Jawa 1.6. Из-за настройки Eclipse IDE JDK, созданный файл класса компилируется с Java 1.7.

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

pankaj@Pankaj:~/Java7Features/bin$java com/journaldev/util/ExceptionInMain Exception in thread "main" java.lang.UnsupportedClassVersionError: com/journaldev/util/ExceptionInMain : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

Если запустить версию Java1.7, то это исключение не появится. Смысл этого исключения – это невозможность компилирования java-файла с более свежей версии на устаревшей версии JRE.

Исключение java.lang.NoClassDefFoundError

Существует два варианта. Первый из них – когда программист предоставляет полное имя класса, помня, что при запуске Java программы, нужно просто дать имя класса, а не расширение.

Обратите внимание: если написать: .class в следующую команду для запуска программы – это вызовет ошибку NoClassDefFoundError. Причина этой ошибки — когда не удается найти файл класса для выполнения Java.

pankaj@Pankaj:~/CODE/Java7Features/bin$java com/journaldev/util/ExceptionInMain.class Exception in thread "main" java.lang.NoClassDefFoundError: com/journaldev/util/ExceptionInMain/class Caused by: java.lang.ClassNotFoundException: com.journaldev.util.ExceptionInMain.class at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

Второй тип исключения происходит, когда Класс не найден.

pankaj@Pankajs-MacBook-Pro:~/CODE/Java7Features/bin/com/journaldev/util$java ExceptionInMain Exception in thread "main" java.lang.NoClassDefFoundError: ExceptionInMain (wrong name: com/journaldev/util/ExceptionInMain) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:791) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 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:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)

Обратите внимание, что класс ExceptionInMain находится в пакете com.journaldev.util, так что, когда Eclipse компилирует этот класс, он размещается внутри /com/journaldev/util. Следовательно: класс не найден. Появится сообщение об ошибке.

Исключение java.lang.NoSuchMethodError: main

Это исключение происходит, когда вы пытаетесь запустить класс, который не имеет метод main. В Java.7, чтобы сделать его более ясным, изменяется сообщение об ошибке:

pankaj@Pankaj:~/CODE/Java7Features/bin$ java com/journaldev/util/ExceptionInMain Error: Main method not found in class com.journaldev.util.ExceptionInMain, please define the main method as: public static void main(String[] args) Exception in thread "main" java.lang.ArithmeticException

Всякий раз, когда происходит исключение из метода main – программа выводит это исключение на консоль.

В первой части сообщения поясняется, что это исключение из метода main, вторая часть сообщения указывает имя класса и затем, после двоеточия, она выводит повторно сообщение об исключении.

Например, если изменить первоначальный класс появится сообщение System.out.println(10/0) ; Программа укажет на арифметическое исключение.

Exception in thread "main" java.lang.ArithmeticException: / by zero at com.journaldev.util.ExceptionInMain.main(ExceptionInMain.java:6)

Методы устранения исключений в thread main

Выше приведены некоторые из распространенных исключений Java в потоке main, когда вы сталкиваетесь с одной из следующих проверок:

  1. Эта же версия JRE используется для компиляции и запуска Java-программы.
  2. Вы запускаете Java-класс из каталога классов, а пакет предоставляется как каталог.
  3. Ваш путь к классу Java установлен правильно, чтобы включить все классы зависимостей.
  4. Вы используете только имя файла без расширения .class при запуске.
  5. Синтаксис основного метода класса Java правильный.

Средняя оценка 2.1 / 5. Количество голосов: 17

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

Напишите комментарий, что можно добавить к статье, какой информации не хватает.

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

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

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

ошибка NoClassDefFoundError Java

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

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

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

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

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

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

Exception in thread "main" java.lang.NoClassDefFoundError

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

[ads-pc-3]
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.

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

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

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

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

/** * Java program to demonstrate how failure of static initialization subsequently cause * java.lang.NoClassDefFoundError in Java. * @author Javin Paul */ public class NoClassDefFoundErrorDueToStaticInitFailure < public static void main(String args[])< List users = new ArrayList(2); for(int i=0; icatch(Throwable t) < t.printStackTrace(); >> > > class User < private static String USER_ID = getUserId(); public User(String id)< this.USER_ID = id; >private static String getUserId() < throw new RuntimeException("UserId Not found"); >> Output java.lang.ExceptionInInitializerError at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23) Caused by: java.lang.RuntimeException: UserId Not found at testing.User.getUserId(NoClassDefFoundErrorDueToStaticInitFailure.java:41) at testing.User.(NoClassDefFoundErrorDueToStaticInitFailure.java:35) . 1 more java.lang.NoClassDefFoundError: Could not initialize class testing.User at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)
  1. Поскольку NoClassDefFoundError также является LinkageError, который возникает из-за зависимости от какого-либо другого класса, вы также можете получить java.lang.NoClassDefFoundError, если ваша программа зависит от собственной библиотеки, а соответствующая DLL отсутствует. Помните, что это может также вызвать java.lang.UnsatisfiedLinkError: no dll in java.library.path. Чтобы решить эту проблему, держите dll вместе с JAR.
  2. Если вы используете файл ANT, создайте JAR, стоит отметить отладку до этого уровня, чтобы убедиться, что скрипт компоновки ANT получает правильное значение classpath и добавляет его в файл manifest.mf.
  3. Проблема с правами доступа к файлу JAR. Если вы работаете с Java-программой в многопользовательской операционной системе, такой как Linux, вам следует использовать идентификатор пользователя приложения для всех ресурсов приложения, таких как файлы JAR, библиотеки и конфигурации. Если вы используете разделяемую библиотеку, которая используется несколькими приложениями, работающими под разными пользователями, вы можете столкнуться с проблемой прав доступа, например, файл JAR принадлежит другому пользователю и недоступен для вашего приложения.
  4. Опечатка в конфигурации XML также может вызвать NoClassDefFoundError в Java. Как и большинство Java-фреймворков, таких как Spring, Struts все они используют конфигурацию XML для определения bean-компонентов. В любом случае, если вы неправильно указали имя компонента, он может вызвать ошибку при загрузке другого класса. Это довольно часто встречается в среде Spring MVC и в Apache Struts, где вы получаете множество исключений при развертывании файла WAR или EAR.
  5. Когда ваш скомпилированный класс, который определен в пакете, не присутствует в том же пакете во время загрузки, как в случае с JApplet.
  6. Еще одна причина- это нескольких загрузчиков классов в средах J2EE. Поскольку J2EE не использует стандартную структуру загрузчика классов, а зависит от Tomcat, WebLogic, WebSphere и т.д., от того, как они загружают различные компоненты J2EE, такие как WAR-файл или EJB-JAR-файл. Кроме того, если класс присутствует в обоих файлах JAR и вы вызовете метод equals для сравнения этих двух объектов, это приведет к исключению ClassCastException, поскольку объект, загруженный двумя различными загрузчиками классов, не может быть равным.
  7. Очень редко может происходить Exception in thread “main” java.lang.NoClassDefFoundError: com/sun/tools/javac/Main. Эта ошибка означает, что либо ваш Classpath, PATH или JAVA_HOME не настроен должным образом, либо JDK установка не правильная. Попробуйте переустановить JDK. Замечено, что проблема возникала после установки jdk1.6.0_33 и последующей переустановки JDK1.6.0_25.

Средняя оценка 2.5 / 5. Количество голосов: 42

Lang noclassdeffounderror как исправить java

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

  • Класс, который вы пытаетесь загрузить, не существует.
  • Класс существует, но не может быть найден в нужном месте или не был правильно упакован в .jar файл или другой архив.
  • Класс зависит от другого класса, который не может быть найден. Чтобы исправить ошибку NoClassDefFoundError , попробуйте выполнить следующие действия:
  • Проверьте, что класс, который вы пытаетесь загрузить, существует и правильно написан в коде. Убедитесь, что вы правильно указали имя класса и его пакет в коде.
  • Проверьте, что файл с классом находится в нужном месте. Если вы используете IDE, убедитесь, что файл с классом находится в правильной папке проекта. Если вы используете командную строку для компиляции и запуска, проверьте, что файл с классом находится в правильной директории.
  • Проверьте, что все необходимые библиотеки и зависимости подключены к вашему проекту. Убедитесь, что все файлы .jar находятся в правильных местах и были правильно добавлены в ваш проект.
  • Если проблема заключается в том, что класс зависит от другого класса, который не может быть найден, убедитесь, что этот класс также находится в вашем проекте и был правильно добавлен в зависимости.
  • Перезапустите вашу IDE или программу. Иногда это помогает, особенно если проблема заключается в загрузке класса из кеша. В общем, причины ошибки NoClassDefFoundError могут быть различными, поэтому их решение может зависеть от конкретного случая. Но в большинстве случаев, приведенные выше рекомендации помогают исправить эту ошибку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *