JRE 1.7 - Java版本 - 返回:java/lang/NoClassDefFoundError: java/lang/Object。 (JRE 1.7 - Java Version - Returns: java/lang/NoClassDefFoundError: java/lang/Object.)

140
运行任何Java应用程序或只是“java”时,JVM会失败:

VM初始化期间发生错误
java/lang/NoClassDefFoundError: java/lang/Object

这里有一些错误答案:
  1. 正确的Java主目录,包括/bin目录,已添加到全局PATH中。

  2. JAVA_HOME设置正确。

  3. 执行命令java -fullversion有效。

$ java -fullversion

./java full version "1.7.0_05-b05"
  • /usr/java中的符号链接都指向正确的Java安装

  • 我在创建系统时没有安装任何“默认”Java

  • java -version失败...与上述相同的错误

  • 在Java安装目录结构下发出命令也不起作用

  • 这是64位Java,适用于64位

  • 有什么想法吗?


    2
    似乎在加载JRE时,JVM需要的rt.jar文件存在问题。 - Bhavik Ambani
    可能是一些权限相关的问题? - Mark Bramnik
    运行truss/strace以查看任何缺失的文件/文件权限。 - Jayan
    在这个与编程有关的内容中,评论区第一个评论提供了一个十六进制技巧来修补安装程序。请访问http://inbytebg.com/techblog/?p=189。 - Sebastian
    你忘了说你是如何安装这个版本的Java的。 - Thorbjørn Ravn Andersen
    28个回答

    190

    这个问题源自Java安装不正确。

    可能性1

    注意: 此情况仅适用于Java 8及以前版本。从Java 9开始,JRE的结构有所不同。rt.jar等文件不再存在,Pack200也不再使用。

    Java标准库包含在各种JAR文件中,例如rt.jardeploy.jarjsse.jar等。当JRE被打包时,这些关键的JAR文件会被Pack200压缩,并存储为rt.packdeploy.packjsse.pack等。Java安装程序应该对它们进行解压缩。如果您遇到此错误,则显然没有执行这个步骤。

    您需要手动在JRE的lib/lib/ext/文件夹中对所有.pack文件运行unpack200

    Windows

    要解压一个.pack文件(例如rt.pack),请运行:

    "%JAVA_HOME%\bin\unpack200" -r -v rt.pack rt.jar
    

    为了递归地解压所有的.pack文件,请从JRE根目录运行以下命令:
    for /r %f in (*.pack) do "%JAVA_HOME%\bin\unpack200.exe" -r -q "%f" "%~pf%~nf.jar"
    

    *nix

    要解压一个.pack文件(例如rt.pack),请运行:

    /usr/bin/unpack200 -r -v rt.pack rt.jar
    

    要递归解压所有.pack文件,请从JRE根目录运行:

    find -iname "*.pack" -exec sh -c "/usr/bin/unpack200 -r -q {} \$(echo {} | sed 's/\(.*\.\)pack/\1jar/')" \;
    

    可能性2

    您以其他方式错误地安装了Java。也许您在没有管理员权限的情况下安装,或者尝试仅从安装程序中提取文件。请再次使用安装程序和/或更高的特权进行尝试。或者,如果您不想使用安装程序,请改用.tar.gz Java软件包。


    2
    这是一个关于Solaris的问题,不是Windows。 - Robin Kanters
    1
    如果您只是想下载Java Linux归档文件,而不想使用安装脚本,那么这个解决方案会对您有所帮助。 - PotOfTea
    23
    由于这个问题/错误的消息、症状和解决方法与平台无关,因此请注意,这是一个Java RE问题,而不是Solaris问题。请注意不要更改原意,让内容更加易懂。 - user719662
    1
    确认在 Java 进行自动更新后,在 Windows 上出现了此问题。 - Lassi Kinnunen
    5
    我通常只使用 for %i in (*.pack) do (..\bin\unpack200 "%i" "%~ni.jar" & del "%i") 这个命令(也许有一天我会使它更加健壮,以便我不必手动更改路径,但是反正我通常只使用 JRE 的 .gz 发布版本,它们没有被打包)。 - Synetech
    显示剩余4条评论

    31

    对于*nix操作系统上的Java 8,请转到<jdk root>/jre/lib目录(对我来说是/usr/java/jdk1.8.0_05/jre/lib)。从该目录执行以下命令:

    ../../bin/unpack200 rt.pack rt.jar
    ../../bin/unpack200 jsse.pack jsse.rar
    ../../bin/unpack200 charsets.pack charsets.jar
    

    为了避免版本问题,如果您安装了另一个JRE,请使用与正在修复的JRE一起提供的相同的unpack200 - 也就是说,从命令行使用../../bin/unpack200(对于我来说,这会扩展到/usr/java/jdk1.8.0_05/bin/unpack200),而不仅仅是unpack200


    3
    为了进行开发,您需要解压缩其他一些包: 在“<jdk1.8_root>/lib”路径下,执行命令../bin/unpack200 tools.pack tools.jar“<jdk1.8_root>/jre/lib/ext”路径下,依次执行以下命令: ../../bin/unpack200 jfxrt.pack jfxrt.jar ../../bin/unpack200 localedata.pack localedata.jar - betontalpfa
    一些脚本可以在这里找到,用于从手动提取的JDK中解压缩所有丢失的jar文件:https://dev59.com/9nE95IYBdhLWcg3wrP6w - Kloe2378231
    1
    这是我的问题所在。 我正在使用Ubuntu 18.04。 谢谢! - Boncho Valkov

    13

    看起来对于64位架构,您需要安装32位版本和64位版本的jre(rt.jar等与架构无关的文件仅在32位版本中分发)。

    然后记得注意将正确的Java可执行文件包含在全局PATH环境变量中。


    3
    你是从哪里获得这个信息的:“仅在32位版本中分发与架构无关的文件,例如rt.jar”? - Aleksandr M
    我刚刚检查了分发内容。 - Tommaso
    没错,你说得对。在 Solaris 64 位的 jre 包中不包含 rt.jar。 - Aleksandr M
    3
    此外 - 我们在SmartOS上进行手动安装时遇到了这个问题。按照 https://blogs.oracle.com/thefield/entry/solaris_11_jdk_installation 上找到的指示(在大多数情况下)操作,你就可以解决问题。 - Khushil
    我安装了jdk-7u79-solaris-sparcv9.tar.Z和jdk-7u79-solaris-sparc.tar.Z两个包。现在看起来它正在工作。谢谢。 - Alex Pi
    那个链接已经失效了,但我下载了两个安装包并将64位的覆盖在32位的上面,这样就解决了问题。 - Jeramy Rutley

    12

    快速解决方法:如果你很不耐烦,可以尝试以下方法(仅适用于Windows系统):

    前往 C:\Windows\System32 目录并删除 java.exe 文件(或将其重命名为像 java.exe.old 这样的名称)。

    从至少 1.6 版本开始,在 Windows 目录中不应该存在 java.exe 文件。如果存在该文件,这可能是某个程序留下来的。

    更多阅读:

    真的很惊讶一个2012年的问题竟然还没有被解决,而我在我的Win 7 32位操作系统上在2015年遇到了同样的问题!

    那么发生了什么?

    基本上一切都很正常,我下载了H2数据库,但当我尝试启动 H2 Console (Command Line) 时,我得到了以下错误信息:

    Error occurred during initialization of VM
    java/lang/NoClassDefFoundError: java/lang/Object
    
    我发现了这个问题并且我能够证实相同的症状:
    JAVA_HOME已正确设置:
    echo %JAVA_HOME%
    C:\Program Files\Java\jdk1.6.0_26
    

    java -version执行失败,而java --fullversion正常运行:

    java -fullversion
    java full version "1.6.0_45-b06"
    

    解决方案: 进入 C:\Windows\System32 目录,删除(实际上我是重命名了)java.exe 文件!!!

    现在,问题已经解决:

    java -version
    java version "1.6.0_26"
    Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
    Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)
    

    并且 H2控制台(命令行) 也运行良好!

    感谢本论坛上的最后一篇发帖: https://bukkit.org/threads/java-lang-noclassdeffounderror-java-lang-object.70450/


    我也遇到了这个问题,但看起来在你的情况下,你只是使用了一个旧版本的Java。1.6.0_26 != 1.6.0_45,你的旧版本可能没有这个问题。 - Centimane
    非常好!我已经安装了JDK 1.6.0_26,而那个“更新”的版本来自Windows System32文件夹。两者都在PATH环境变量中,但我实际上不想使用Windows提供的Java运行时。因此,删除它解决了这个问题。也许你的PATH中也有两个Java运行时? - iaforek
    对我来说,我的安装缺少rt.jar(这是您找到java.lang.Object的地方)。不幸的是,当我从kickstart安装RPM时,它缺少rt.jar,但如果我在之后安装它,它就会出现,这是一个有趣的问题。 - Centimane
    我无法帮助你处理 RPM 包。很抱歉。 - iaforek
    4
    对我来说,C:\ProgramData\Oracle\Java\javapath 中的 Java 符号链接引起了问题。我更改了 PATH 环境变量,现在它可以工作了。 - WhiteKnight
    显示剩余2条评论

    11

    今天我下载了新的JDK(1.8.0.73),启动c:> java.exe时出现了臭名昭著的错误:

    Error occurred during initialization of VM
    java/lang/NoClassDefFoundError: java/lang/Object
    
    我只是想在这里分享我的解决方案。当我进入 jdk\bin 文件夹时,Java 能够正常运行,所以我知道问题出在了 PATH 上。我在 CMD 中将 PATH 设置为只有 \jdk\bin,以证明它能够工作。因此,我认为 PATH 中的某个文件夹包含有引起冲突的 java.exe。事实证明,这是 C:\>ProgramData\Oracle\Java\javapath,它保存有指向可执行文件的符号链接。 java.exe 指向 jre\bin,而该文件已损坏。当我启动 \jre\bin\java.exe 时,出现了完全相同的错误。我重新安装了 JRE,问题得以解决。愉快的编码...

    8
    您的安装中很可能缺少一个名为 rt.jar 的文件,其中包含 java.lang.Object 类文件。请检查您的安装文件等。
    特别要注意的是,64位安装程序会覆盖(或“安装到”)现有的32位安装。换句话说,为了获得完全可用的64位安装,您必须先运行32位安装,然后在64位可用的机器上运行64位安装...
    如果您只进行了64位安装,将会缺少安装所需的某些文件,并出现上述错误。

    这是答案的一部分。您需要解压缩您的Java SDK路径下/lib和lib/ext目录中的所有*.pack文件。unpack200可以帮助您完成此操作。请参阅Rigg802的评论。 - Melroy van den Berg

    7

    当您通过“解压缩”而不是“执行”安装JDK时,就会出现此问题。

    例如:

    unzip jdk-6u45-linux-x64.bin  (wrong)
    
    sh ./jdk-6u45-linux-x64.bin   (right)
    

    在第一种情况下,运行时库文件(例如rt.jar)不会自动解压缩(因此,您可能会找到 rt.pack 文件等,而不是 .jar 文件)。

    7
    在Windows 10上,我遇到了与JRE 1.8(8u121)相同的问题。
    输入:
    java -version
    

    命令提示符返回
    Error occurred during initialization of VM
    java/lang/NoClassDefFoundError: java/lang/Object
    

    所有其他命令,echo %JAVA_HOME%echo %JRE_HOME%echo %PATH%java -fullversion 都能正常工作。
    转到系统管理面板上的环境变量,从 PATH 中删除链接 C:\ProgramData\Oracle\Java\javapath ,并确保在 PATH 中设置了指向 C:\Program Files\Java Folder\bin 的链接。
    之后,检查是否存在一个 java.exe 文件位于 C:\Windows\System32 中;如果是,则删除该文件。
    现在键入 java -version ,它会正常工作。

    2
    我在Windows升级后遇到了同样的问题,但我没有C:\Program Files\Java Folder\bin文件夹。相反,我使用C:\Program Files\Java\jdk1.8.0_161\bin,但这并没有帮助我解决问题。在System32文件夹中也没有java.exe文件。 - Tom

    5

    最近我也遇到了同样的问题。在我的情况下,我的Windows 7机器自动下载了Java,并将C:\ProgramData\Oracle\Java\javapath添加到我的路径环境变量的开头,这导致了我的Java出现问题。一旦我从路径中删除了它,就可以正常工作了。


    4
    如果您在Java二进制文件上执行"chmod u+rx"并运行它,它将解压缩JAR文件,然后您就可以执行"java -version"而不会出现运行时错误。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接