- HowTo
- Java Howtos
- Error Occurred During Initialization of …
This tutorial demonstrates the Error occurred during initialization of VM java/lang/noclassdeffounderror: java/lang/object
error in Java.
Error Occurred During Initialization of VM java/lang/noclassdeffounderror: java/lang/object
The Error occurred during initialization of VM java/lang/noclassdeffounderror: java/lang/object
occurs when systems get confused when running Java. This occurs when we run Java as an environment variable, but running Java from its directory will work properly.
Whenever Error occurred during initialization of VM java/lang/noclassdeffounderror: java/lang/object
occurs, Java is installed properly, and the correct path is set for the environment variables.
The reasons for this error are ambiguous, but some solutions can be applied in different scenarios. The reasons include:
- When we updated the Java Development Kit (JDK) but forgot to update the Java Runtime Environment (JRE). In the recent versions, JRE is included in the JDK, so we don’t have to install it separately.
- When an unknown application has copied
java.exe
files to the Windows directory, and Windows start running Java from the Windows directory, this error will occur when the supportive files are not found.
The error looks like this when we run Java in the CMD:
Error occurred during initialization of VM
java/lang/noclassdeffounderror: java/lang/object
Running Eclipse
Usually, when this error stops Eclipse from initializing. The Eclipse problem can be solved following the steps below.
-
Go to the Eclipse directory.
-
Open the
eclipse.ini
file. -
Add the following lines with your path to the
ini
file before thevmargs
:
-vm
C:Program FilesJavajdk1.7.0_10binjavaw.exe
Save the eclipse.ini
file and run Eclipse.
Check the Windows Directory
If the Error Occurred During Initialization of VM java/lang/noclassdeffounderror: java/lang/object
error is occurring, then you should follow some steps to know the ambiguous reasons:
- Go to the Windows directory.
- Check if you can find the
exe
file from Java. - These files are copied by an application on Windows.
- Deleting these files may solve the problem.
- Finding the application is not easy, but you can check all the applications running Java.
Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.
LinkedIn
Facebook
Related Article — Java JVM
Related Article — Java Error
This issue originally arose from trying to specify a JDBC driver in the RJDBC package. I moved back a step to rJava to see if I could get similar errors. It’s similar to #62, but the original poster didn’t continue to provide feedback.
Here is the error:
> .jinit()
Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object
Here is some information about my system:
> sessionInfo()
R version 3.5.3 (2019-03-11)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Server 7.9 (Maipo)
Matrix products: default
BLAS: /opt/R/R-3.5.3/lib64/R/lib/libRblas.so
LAPACK: /opt/R/R-3.5.3/lib64/R/lib/libRlapack.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.5.3 renv_0.13.2
Here is information about the Java version and settings:
$ /opt/R/R-3.5.3/bin/R CMD javareconf -n
*** JAVA_HOME is not a valid path, ignoring
Java interpreter : /usr/bin/java
Java version : 1.8.0_265
Java home path : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.265.b01-1.el7_9.x86_64/jre
Java compiler : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/bin/jar
trying to compile and link a JNI program
detected JNI cpp flags : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux
detected JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
gcc -std=gnu99 -I"/opt/R/R-3.5.3/lib64/R/include" -DNDEBUG -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.265.b01-1.el7_9.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.265.b01-1.el7_9.x86_64/jre/../include/linux -I/usr/local/include -fpic -g -O2 -c conftest.c -o conftest.o
gcc -std=gnu99 -shared -L/opt/R/R-3.5.3/lib64/R/lib -L/usr/local/lib64 -o conftest.so conftest.o -L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.265.b01-1.el7_9.x86_64/jre/lib/amd64/server -ljvm -L/opt/R/R-3.5.3/lib64/R/lib -lR
JAVA_HOME : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.265.b01-1.el7_9.x86_64/jre
Java library path: $(JAVA_HOME)/lib/amd64/server
JNI cpp flags : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux
JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
Here is the default JAVA_HOME set by my admins (which I can change in my .bash_profile):
$ echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/lib/amd64
Here is the default CLASSPATH set by my admins (which I can change in my .bash_profile):
$ echo $CLASSPATH
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/lib
Here are additional environmental settings from Sys.getenv()
> Sys.getenv()
CLASSPATH /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/lib
COLUMNS 204
CVS_RSH ssh
EDITOR vi
GDAL_DATA /usr/share/epsg_csv
HARDWARE_PLATFORM x86_64
HISTCONTROL ignoredups
HISTSIZE 1000
HOME /home/uid
HOSTNAME xxx.xxx.xxx.xxx.xxx
IQDIR16 /opt/app/SybaseIQ/IQ-16_1
JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/lib/amd64
KRB5CCNAME KEYRING:persistent:xxxxxx
LANG en_US.UTF-8
LD_LIBRARY_PATH /opt/glpk-4.65/lib:/usr/local/lib:usr/local/lib64:/opt/app/SybaseIQ/IQ-16_1/lib64
LESSOPEN ||/usr/bin/lesspipe.sh %s
LINES 55
LN_S ln -s
LOGNAME 8b3sb
LS_COLORS rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL /var/spool/mail/uid
MAKE make
ODBCINI /opt/app/SybaseODBC/odbc.ini
PAGER /bin/less
PATH /opt/R/R-3.5.3/bin:/opt/Python-3.7.4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/app/SybaseIQ/IQ-16_1/bin64
PWD /home/uid
QT_GRAPHICSSYSTEM_CHECKED
1
R_ARCH
R_BROWSER /bin/xdg-open
R_BZIPCMD /bin/bzip2
R_DOC_DIR /opt/R/R-3.5.3/lib64/R/doc
R_GZIPCMD /bin/gzip
R_HOME /opt/R/R-3.5.3/lib64/R
R_INCLUDE_DIR /opt/R/R-3.5.3/lib64/R/include
R_LIBS_SITE
R_LIBS_USER /projects/CI_Analysts/R/x86_64-pc-linux-gnu-library/3.5
R_PAPERSIZE a4
R_PDFVIEWER /bin/xdg-open
R_PLATFORM x86_64-pc-linux-gnu
R_PRINTCMD lpr
R_RD4PDF times,hyper
R_REPOSITORIES repos
R_SESSION_TMPDIR /tmp/RtmpqHbRcH
R_SHARE_DIR /opt/R/R-3.5.3/lib64/R/share
R_SYSTEM_ABI linux,gcc,gxx,gfortran,?
R_TEXI2DVICMD texi2dvi
R_UNZIPCMD /bin/unzip
R_ZIPCMD /bin/zip
SAP_JRE8 /opt/app/SybaseIQ/shared/SAPJRE-8_1_046_64BIT
SAP_JRE8_64 /opt/app/SybaseIQ/shared/SAPJRE-8_1_046_64BIT
SED /bin/sed
SELINUX_ROLE_REQUESTED
SELINUX_USE_CURRENT_RANGE
1
SHELL /bin/bash
SHLVL 2
SSH_ASKPASS /usr/libexec/openssh/gnome-ssh-askpass
SSH_CLIENT xx.xxx.xx.xx xxxxx xx
SSH_CONNECTION xx.xxx.xx.xx xxxxx xx.xxx.xx.xx xx
SSH_TTY /dev/pts/127
SYBASE /opt/app/SybaseIQ
SYBROOT /opt/app/SybaseIQ
TAR /bin/gtar
TERM xterm
USER uid
XDG_RUNTIME_DIR /run/user/xxxxxx
XDG_SESSION_ID xxxxxx
There are multiple Java versions on the server I’m using:
$ alternatives --display java | grep priority | grep java-
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.265.b01-1.el7_9.x86_64/jre/bin/java - family java-1.8.0-openjdk.x86_64 priority 1800265
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64-debug/jre/bin/java - family java-1.8.0-openjdk.x86_64 priority 1800241
/usr/lib/jvm/java-1.8.0-ibm-1.8.0.6.10-1jpp.1.el7.x86_64/jre/bin/java - priority 180610
Is there anything else I can provide?
Any insight is appreciated.
Содержание
- Error Occurred During Initialization of VM Java/Lang/Noclassdeffounderror: Java/Lang/Object
- Error Occurred During Initialization of VM java/lang/noclassdeffounderror: java/lang/object
- Running Eclipse
- Check the Windows Directory
- Java SE — «Error occurred during initialization of VM java.lang.NoClassDefFoundError: java.lang.Object» (Doc ID 1006790.1)
- Applies to:
- Symptoms
- Changes
- Cause
- To view full details, sign in with your My Oracle Support account.
- Don’t have a My Oracle Support account? Click to get started!
- Как исправить ошибку java.lang.NoClassDefFoundError в Java J2EE
- Разбираемся с причинами noclassdeffounderror в Java
- Разница между java.lang.NoClassDefFoundError и ClassNotFoundException в Java
- Примеры
- NoClassDefFoundError в Java из-за исключения в блоке инициализатора
- Способы исправления java.lang.NoClassDefFoundError в Java J2EE
- Содержание
- Введение
- В чём причина NoClassDefFoundError в Java?
- Разница между java.lang.NoClassDefFoundError и ClassNotFoundException в Java
- NoClassDefFoundError в Java. Примеры и сценарии
- Загрузчик классов в Java
Error Occurred During Initialization of VM Java/Lang/Noclassdeffounderror: Java/Lang/Object
This tutorial demonstrates the Error occurred during initialization of VM java/lang/noclassdeffounderror: java/lang/object error in Java.
Error Occurred During Initialization of VM java/lang/noclassdeffounderror: java/lang/object
The Error occurred during initialization of VM java/lang/noclassdeffounderror: java/lang/object occurs when systems get confused when running Java. This occurs when we run Java as an environment variable, but running Java from its directory will work properly.
Whenever Error occurred during initialization of VM java/lang/noclassdeffounderror: java/lang/object occurs, Java is installed properly, and the correct path is set for the environment variables.
The reasons for this error are ambiguous, but some solutions can be applied in different scenarios. The reasons include:
- When we updated the Java Development Kit (JDK) but forgot to update the Java Runtime Environment (JRE). In the recent versions, JRE is included in the JDK, so we don’t have to install it separately.
- When an unknown application has copied java.exe files to the Windows directory, and Windows start running Java from the Windows directory, this error will occur when the supportive files are not found.
The error looks like this when we run Java in the CMD:
Running Eclipse
Usually, when this error stops Eclipse from initializing. The Eclipse problem can be solved following the steps below.
Go to the Eclipse directory.
Open the eclipse.ini file.
Add the following lines with your path to the ini file before the vmargs :
Save the eclipse.ini file and run Eclipse.
Check the Windows Directory
If the Error Occurred During Initialization of VM java/lang/noclassdeffounderror: java/lang/object error is occurring, then you should follow some steps to know the ambiguous reasons:
- Go to the Windows directory.
- Check if you can find the exe file from Java.
- These files are copied by an application on Windows.
- Deleting these files may solve the problem.
- Finding the application is not easy, but you can check all the applications running Java.
Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.
Источник
Java SE — «Error occurred during initialization of VM java.lang.NoClassDefFoundError: java.lang.Object» (Doc ID 1006790.1)
Last updated on NOVEMBER 14, 2021
Applies to:
Symptoms
When trying to run a Java SE application, the following error message is reported:
Changes
Actions that are known to trigger this problem:
- Trying to run a 64-bit JVM on Solaris (SPARCv9 or x64) when the required 32-bit JVM is not installed. This does not apply to JDK 8 and later since starting with JDK 8 there is no longer a 32-bit JVM.
- Removing the file rt.jar from the JVM installation folder, implicitly or explicitly. Third-party anti-virus software has been known to cause this problem on Microsoft Windows platforms.
- Lack of read access rights to the file rt.jar.
- Using the JVM’s -Xbootclasspath switch to modify the search path of the bootstrap class loader and not including the file rt.jar on the search path.
Cause
To view full details, sign in with your My Oracle Support account.
Don’t have a My Oracle Support account? Click to get started!
My Oracle Support provides customers with access to over a million knowledge articles and a vibrant support community of peers and Oracle experts.
Oracle offers a comprehensive and fully integrated stack of cloud applications and platform services. For more information about Oracle (NYSE:ORCL), visit oracle.com. пїЅ Oracle | Contact and Chat | Support | Communities | Connect with us | |
|
| Legal Notices | Terms of Use
Источник
Как исправить ошибку 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
[ads-pc-3]
java.lang.ClassNotFoundException и java.lang.NoClassDefFoundError оба связаны с Java Classpath, и они полностью отличаются друг от друга.
ClassNotFoundException возникает, когда JVM пытается загрузить класс во время выполнения, т.е. вы даете имя класса во время выполнения, а затем JVM пытается загрузить его, и если этот класс не найден, он генерирует исключение java.lang.ClassNotFoundException.
Тогда как в случае NoClassDefFoundError проблемный класс присутствовал во время компиляции, и поэтому программа успешно скомпилирована, но не доступна во время выполнения по любой причине.
Приступим к решению ошибки java.lang.NoClassDefFoundError.
Нам нужно добавить NoClassDefFoundError в Classpath или проверить, почему он не доступен в Classpath. Там может быть несколько причин, таких как:
- Класс недоступен в Java Classpath.
- Возможно, вы запускаете вашу программу с помощью jar, а класс не определен в атрибуте ClassPath.
- Любой сценарий запуска переопределяет переменную среды Classpath.
Поскольку NoClassDefFoundError является подклассом java.lang.LinkageError, он также может появиться, если библиотека может быть недоступна. - Проверьте наличие java.lang.ExceptionInInitializerError в файле журнала. NoClassDefFoundError из-за сбоя инициализации встречается довольно часто.
- Если вы работаете в среде J2EE, то видимость Class среди нескольких Classloader также может вызвать java.lang.NoClassDefFoundError.
Примеры
- Простой пример NoClassDefFoundError – класс принадлежит отсутствующему файлу JAR, или JAR не был добавлен в путь к классам, или имя jar было изменено кем-то.
- Класс не находится в Classpath, нет способа узнать это, но вы можете просто посмотреть в System.getproperty (“java.classpath”), и он напечатает classpath оттуда, где можно получить представление о фактическом пути к классам во время выполнения.
- Просто попробуйте запустить явно -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]
- Поскольку NoClassDefFoundError также является LinkageError, который возникает из-за зависимости от какого-либо другого класса, вы также можете получить java.lang.NoClassDefFoundError, если ваша программа зависит от собственной библиотеки, а соответствующая DLL отсутствует. Помните, что это может также вызвать java.lang.UnsatisfiedLinkError: no dll in java.library.path. Чтобы решить эту проблему, держите dll вместе с JAR.
- Если вы используете файл ANT, создайте JAR, стоит отметить отладку до этого уровня, чтобы убедиться, что скрипт компоновки ANT получает правильное значение classpath и добавляет его в файл manifest.mf.
- Проблема с правами доступа к файлу JAR. Если вы работаете с Java-программой в многопользовательской операционной системе, такой как Linux, вам следует использовать идентификатор пользователя приложения для всех ресурсов приложения, таких как файлы JAR, библиотеки и конфигурации. Если вы используете разделяемую библиотеку, которая используется несколькими приложениями, работающими под разными пользователями, вы можете столкнуться с проблемой прав доступа, например, файл JAR принадлежит другому пользователю и недоступен для вашего приложения.
- Опечатка в конфигурации XML также может вызвать NoClassDefFoundError в Java. Как и большинство Java-фреймворков, таких как Spring, Struts все они используют конфигурацию XML для определения bean-компонентов. В любом случае, если вы неправильно указали имя компонента, он может вызвать ошибку при загрузке другого класса. Это довольно часто встречается в среде Spring MVC и в Apache Struts, где вы получаете множество исключений при развертывании файла WAR или EAR.
- Когда ваш скомпилированный класс, который определен в пакете, не присутствует в том же пакете во время загрузки, как в случае с JApplet.
- Еще одна причина- это нескольких загрузчиков классов в средах J2EE. Поскольку J2EE не использует стандартную структуру загрузчика классов, а зависит от Tomcat, WebLogic, WebSphere и т.д., от того, как они загружают различные компоненты J2EE, такие как WAR-файл или EJB-JAR-файл. Кроме того, если класс присутствует в обоих файлах JAR и вы вызовете метод equals для сравнения этих двух объектов, это приведет к исключению ClassCastException, поскольку объект, загруженный двумя различными загрузчиками классов, не может быть равным.
- Очень редко может происходить 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. Количество голосов: 36
Источник
Способы исправления java.lang.NoClassDefFoundError в Java J2EE
Содержание
Данная статья представляет перевод оригинальных публикаций следующих авторов:
Переводчик выражает благодарность Виктору Жуковскому за ценные правки и обсуждение рукописи.
Введение
Известно насколько неприятно видеть исключение java.lang.NoClassDefFoundError в потоке » main «. Многие разработчики проводят много времени прежде всего пытаясь понять, что пошло не так, какого класса не хватает и в чём суть проблемы. Во-первых, они путают между собой ClassNotfoundException и NoClassDefFoundError , хотя на самом деле это два совершенно разных исключения. Во-вторых, они используют метод «научного тыка» для решения проблемы NoClassDefFoundError вместо ясного понимания почему ошибка случилась и как её исправить. В этой статье по Java мы откроем некоторые секреты исправления ошибки NoClassDefFoundError в Java и поделимся своим опытом решения подобной проблемы.
Ошибка NoClassDefFoundError не является чем-то, что не может быть устранено или чем-то, что очень трудно устраняемо — нет, NoClassDefFoundError всего лишь проявление другой, более глубинной ошибки, что сбивает с толку большинство Java разработчиков. NoClassDefFoundError наиболее распространённая ошибка в Java разработке наряду с java.lang.OutOfMemoroyError: Java heap space и java.lang.OutOfMemoryError: PermGen space . Давайте посмотрим почему в Java происходит NoClassDefFoundError и что делать, чтобы её исправить.
В чём причина NoClassDefFoundError в Java?
NoClassDefFoundError в Java происходит тогда, когда виртуальная машина Java во время исполнения кода не может найти определённый класс, который был доступен во время компиляции. Например, если мы вызываем метод из класса или обращаемся к статическому члену класса и этот класс не доступен во время выполнения, то виртуальная машина Java выбрасывает NoClassDefFoundError . Важно понимать, что эта ошибка отличается от исключения ClassNotFoundException , которое происходит при попытке загрузки класса во время выполнения, причём важно, что имя этого класса было определено только во время выполнения, но не во время компиляции кода. Многие Java разработчики путают эти две ошибки и приходят в тупик при попытке разрешить вопрос.
Коротко говоря, NoClassDefFoundError происходит, если класс присутствовал во время компиляции, но не доступен в classpath во время исполнения. Обычно в этом случае вы увидите следующую строку в журнале ошибок:
Exception in thread «main» java.lang.NoClassDefFoundError
Фраза Exception in thread «main» означает, что именно поток » main » не может найти определённый класс. Вместо » main » может быть любой поток. Разница между тем, когда эта ошибка возникает в потоке » main » и в другом потоке в состоит том, что при возникновении в потоке » main » программа останавливается, а при возникновении в ином потоке, напротив, продолжает выполнение после ошибки.
Разница между java.lang.NoClassDefFoundError и ClassNotFoundException в Java
Прежде чем рассмотреть разницу между ClassNotFoundException и NoClassDefFoundError давайте рассмотрим, что между ними общего и что приводит к путанице между этими двумя ошибками:
- Обе ошибки связаны с недоступностью класса во время выполнения;
- Обе ошибки связаны с Java Classpath .
Теперь о различиях.
- ClassNotFoundException возникает в Java, если мы пытаемся загрузить класс во время выполнения используя методы Class.forName() , ClassLoader.loadClass() или ClassLoader.findSystemClass() , причём необходимый класс не доступен для Java. Зачастую причина тому — неправильный Classpath . В большинстве своём нам кажется, что мы используем корректный Classpath , но оказывается, что приложение использует совсем другой Classpath — не тот, который мы ожидали. Например, Classpath , заданный в манифесте jar файла, перезаписывает Classpath в переменной окружения CLASSPATH или опции -cp , заданной при запуске jar файла. В отличие от ClassNotFoundException в случае с NoClassDefFoundError проблемный класс присутствовал во время компиляции, и, поэтому, программа успешно прошла компиляцию, но по некоторой причине класс отсутствует во время исполнения. На мой взгляд решить NoClassDefFoundError легче чем ClassNotFoundException , поскольку вы точно знаете, что класс присутствовал во время сборки, но, в общем случае, это сильно зависит от среды разработки. Если вы работаете с J2EE окружением, вы можете получить NoClassDefFoundError даже если класс присутствует, поскольку он может быть невидимым для соответствующего загрузчика классов.
- ClassNotFoundException представляет собой проверяемое исключение, унаследованное непосредственно от класса java.lang.Exception , требующее явной обработки, в то время как NoClassDefFoundError это java.lang.Error , унаследованный от java.lang.LinkageError .
- ClassNotFoundException возникает в результате явной загрузки класса методами Class.forName() , ClassLoader.loadClass() или ClassLoader.findSystemClass() , в то время как NoClassDefFoundError — результат неявной загрузки класса, происходящей при попытке вызова метода из другого класса или доступа к его свойству.
NoClassDefFoundError в Java. Примеры и сценарии
Итак, очевидная причина NoClassDefFoundError состоит в том, что определённый класс не доступен в Classpath , так что нам нужно добавить его в Classpath или понять почему его нет в Classpath , хотя мы ожидаем его там найти. Для этого могут быть несколько причин:
- Класс не задан непосредственно в самой переменной Classpath .
- Распечатайте значение System.getproperty(«java.classpath») в Java программе.
- Проверьте, не перезаписывает ли значение переменной окружения Classpath скрипт, запускающий приложение. Запустите программу с явной опцией -classpath , где укажите тот classpath , который по вашему мнению сработает, и если в этом случае программа заработает, то это хороший знак, что кто-то перезатирает ваш classpath .
- Класс отсутствует по местоположению, указанному в переменной Classpath .
- Проверьте, не удалил ли кто-то ваш jar-файл, или быть может переименовал его.
- Загрузчик классов не имеет прав на чтение файла, указанного в переменной Classpath , на уровне операционной системы.
- Используйте один и тот же id пользователя для всех ресурсов вашего приложения: JAR файлов, библиотек и файлов конфигурации.
- Класс не определён в атрибуте ClassPath файла манифеста, при запуске программы с помощью команды jar .
- Если вы используете файл сборки ANT для создания JAR архива и файла манифеста, то проверьте получает ли скрипт сборки ANT правильное значение classpath и добавляет ли его в файл manifest.mf .
- Виртуальная машина Java не нашла одну из зависимостей, например, нативную библиотеку. Эта ошибка выбрасывается поскольку NoClassDefFoundError является наследником java.lang.LinkageError .
- Храните ваши dll совместно с jar-файлами.
- Виртуальная машина Java не смогла завершить статическую инициализацию класса.
- Проверьте наличие ошибки java.lang.ExceptionInInitializerError в вашем журнале ошибок.
- Родительский загрузчик классов не видит класс, поскольку тот был уже загружен дочерним загрузчиком. Если вы работаете со средой J2EE, то неверная настройка видимости класса среди загрузчиков классов может также привести к java.lang.NoClassDefFoundError .
- Опечатка в XML конфигурации также может привести к NoClassDefFoundError в Java. Большинство программных платформ вроде Spring и Struts используют XML конфигурации для определения бинов. Случайно перепутав имя бина, вы можете получить java.lang.NoClassDefFoundError при загрузке другого класса, который зависит от бина. Это случается довольно часто в программных платформах Spring MVC и Apache Struts, где вы получаете тонны ошибок Exception in thread «main» java.lang.NoClassDefFoundError во время установки WAR или EAR файла.
- Переменные окружения или JDK установлены неверно.
- Проверьте переменные PATH и JAVA_HOME .
- Поставьте JDK другой версии.
Загрузчик классов в Java
Вкратце напомним, что загрузчик классов использует три основных принципа в своей работе: делегирование, видимость и уникальность.
- Делегирование означает, что каждый запрос на загрузку класса делегируется родительскому загрузчику классов.
- Видимость означает возможность найти классы загруженные загрузчиком классов: все дочерние загрузчики классов могут видеть классы, загруженные родительским загрузчиком, но родительский загрузчик не может видеть класс, загруженный дочерним.
- Уникальность гарантирует, что класс, загруженный родительским загрузчиком, не загружается повторно дочерним загрузчиком.
Каждый экземпляр загрузчика классов имеет связанный с ним родительский загрузчик классов. Предположим, загрузчик классов вашего приложения должен загрузить класс A . Первым делом загрузчик классов вашего приложения попытается делегировать поиск класса A своему родительскому загрузчику, прежде чем сам попытается его загрузить. Вы можете пройтись по длинной цепочке родительских загрузчиков пока не дойдёте до стартового загрузчика виртуальной машины Java.
Так в чём же тут проблема? Если класс A найден и загружен каким-нибудь родительским загрузчиком, это значит, что дочерний загрузчик загружать его уже не будет, а вы, возможно, именно этого и ждёте, что и приводит к NoClassDefFoundError .
Для лучшего понимания изобразим весь процесс загрузки в контексте платформы Java EE.
Как вы можете видеть при попытке загрузки класса дочерний загрузчик (Web App #1) делегирует загрузку родительскому загрузчику (Java EE App #1), который в свою очередь делегирует её системному стартовому загрузчику JVM. Если системный стартовый загрузчик не может загрузить класс, он возвращает управление родительскому загрузчику и так далее по цепочке пока класс не будет загружен каким-либо загрузчиком.
Рассмотрим простой пример, приводящий к NoClassDefFoundError из-за разной видимости классов между дочерним и родительским загрузчиками. Сделаем свой загрузчик MyClassLoader , наследник от java.lang.ClassLoader такой, чтобы он загружал классы с расширением .test вместо .class , находящиеся в пакете net.javacogito . Отметим, что стандартный загрузчик по умолчанию загружает данные только из файлов с расширением .class , так что загрузить Bar.test он не сможет. Схема дальнейшей работы такая:
- JVM загружает класс Bar из файла Bar.test .
- Класс Bar печатает свой загрузчик классов. Это MyClassLoader .
- JVM загружает класс Foo из файла Foo.class .
- Класс Foo печатает свой загрузчик классов. Это sun.misc.Launcher.AppClassLoader .
- Класс Foo вызывает статический метод printClassLoader() у класса Bar .
В этот момент JVM выдаёт NoClassDefFoundError , не смотря на то, что Bar был загружен ранее, поскольку родительский загрузчик AppClassLoader не видит классы, загруженные дочерним загрузчиком MyClassLoader .
Ниже на рисунке изображена схема делегирования загрузки, приводящая к NoClassDefFoundError .
Источник
- Thread Status:
-
Not open for further replies.
-
Hi,
Just today, I updated my Java to the latest version. But when I tried to start up my home-run server, this is EVERYTHING I see in cmd:Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object Press any key to continue . . .
I have attempted to use the system restore to rollback my computer, but the error remained the same. I’m sure that this is a result of me updating Java (
Recommended Version 6 Update 31)for 64 bit
My Computer’s Specs
OS — Windows 7 64-bit
Architecture and version for Java — Supposedly Version 6 Update 31, however, when I enter java — version, I recieve the SAME error as above.
Wrappers — None
CraftBukkit Vers — 1.2.5-R1.0I appreciate how people on bukkit help each other for nothing in return.
~Thanks in advanced
Ace -
Post your start script please. Wrap it in [ code ] tags.
-
What exactly is my start script? I apologize for not knowing what one is. I have been on Bukkit for no longer than 2 weeks. If you mean want is shown when I click the .bat for starting up my server what I have posted is all I’ve seen. Nothing else.
-
Do you have a «start.bat» or «run.bat» or «start.command» or «start.sh» file (or similar) that you run to get bukkit to start?
-
Oh, I see, here it is:
@ECHO OFF SET BINDIR=%~dp0 CD /D "%BINDIR%" "%ProgramFiles%Javajre6binjava.exe" -Xmx3072M -Xms1024M -jar craftbukkit-1.2.5-R1.0.jar PAUSE
-
Try taking the ‘ .jar ‘ off the end of the fourth line.
-
Unable to access jarfile craftbukkit-1.2.5-R1.0 Press any key to continue . . .
This is what I get in CMD.How could updating my java affect this?
EDIT by Moderator: merged posts, please use the edit button instead of double posting.
Last edited by a moderator: May 25, 2016
-
I never said to update your java, the version you have should work fine.
Delete your craftbukkit-1.2.3-R1.0.jar file
Download this file — http://dl.bukkit.org/latest-rb/craftbukkit.jar
Replace the contents of your start script with:
***IMPORTANT!!!! Remove the ‘***’ from the first line of the start file contents below****@***ECHO OFF SET BINDIR=%~dp0 CD /D "%BINDIR%" "%ProgramFiles%Javajre6binjava.exe" -Xmx1024M -Xms1024M -jar craftbukkit.jar PAUSE
-
Just today, I updated my java, after updating my java, my CraftBukkit server started getting this problem.
-
Are you running Java 7?
Try using
"%ProgramFiles%Javajre7binjava.exe" -Xmx1024M -Xms1024M -jar craftbukkit.jar
on the fourth line of your start file
-
No, I am using Java 6.
-
As this doesn’t seem to be a bukkit issue, could you try uninstalling Java completely and installing it again?
-
Is there supposed to be a folder named lang in there?
-
As this doesn’t seem to be a bukkit issue, could you try uninstalling Java completely and installing it again?
-
After reinstalling on CMD, I get this.
'"C:Program FilesJavajre6binjava.exe"' is not recognized as an internal or external command, operable program or batch file. Press any key to continue . . .
-
Can you upload the contents of your current start bat file to pastebin.com please?
-
Your start file still references » craftbukkit-1.2.5-R1.0.jar «
Did you download the latest craftbukkit from the link I gave you?
Please do that, do not rename the file you download (it should be craftbukkit.jar), and change «craftbukkit-1.2.5-R1.0.jar» in your start script to «craftbukkit.jar» -
I got my server working now. For some reason the newer versions of Java did not work, so I had to look around and I downloaded the old version of Java. Thanks for your help and time.
-
Well at least you’ve got bukkit working, but not in the way we hoped.
@ Bukkit staff members — Do you know what’s going on and how to fix it?
- Thread Status:
-
Not open for further replies.
Share This Page