【问题标题】:JRE 1.7 - java version - returns: java/lang/NoClassDefFoundError: java/lang/ObjectJRE 1.7 - java 版本 - 返回:java/lang/NoClassDefFoundError: java/lang/Object
【发布时间】:2012-08-02 06:37:16
【问题描述】:

当运行任何 java 应用程序,或者只是“java”时,jvm 会失败:

虚拟机初始化过程中发生错误
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"
    
  4. /usr/java 中的符号链接都指向正确的 java 安装

  5. 我在创建系统时没有安装任何“默认”java

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

  7. 从 java 安装的目录结构下发出命令也不起作用

  8. 这是64位的64位java

有什么想法吗?

【问题讨论】:

  • 加载rt.jar文件似乎有问题,这是JVM在加载JRE时需要的文件
  • 可能是一些权限相关的问题?
  • 运行 truss/strace 以查看任何丢失的文件/文件权限
  • inbytebg.com/techblog/?p=189,在第一条评论中有一个十六进制技巧来修补安装程序
  • 你忘了说如何你安装了这个版本的Java。

标签: java


【解决方案1】:

我在 Redhat Linux 7 中遇到了同样的问题。已通过删除、安装以下 RPM 并重新加载终端来解决此问题。

java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64 
java-1.8.0-openjdk-devel-1.8.0.232.b09-0.el7_7.x86_64
java-1.8.0-openjdk-headless-1.8.0.232.b09-0.el7_7.x86_64

【讨论】:

    【解决方案2】:

    如果JAVA安装版本有问题

    C:\JAVA

    将给出它拾取的 java 的位置。如果您有安装以外的任何路径,请删除这些文件或重命名它(可能是 _backup)。您将获得正确版本的 java 文件。

    【讨论】:

      【解决方案3】:

      对于 *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(对我来说,这扩展为 @ 987654327@),而不仅仅是unpack200

      【讨论】:

      • 要开发你必须解压一些其他的包:"<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
      • 可以在此处找到一些脚本来从手动提取的 JDK 中解压所有丢失的 jar:stackoverflow.com/questions/2203922/…
      • 这是我的问题。我正在使用 Ubuntu 18.04。谢谢!
      【解决方案4】:

      此问题源于不正确的 Java 安装。

      可能性 1

      注意:此方案仅适用于 Java 8 及更早版本。从 Java 9 开始,JRE 的结构有所不同。 rt.jar 和朋友不再存在,不再使用 Pack200。

      Java标准库包含在各种JAR中,如rt.jardeploy.jarjsse.jar等。JRE打包时,这些关键的JAR文件用Pack200压缩,存储为@987654326 @、deploy.packjsse.pack 等。Java 安装程序应该解压缩它们。如果您遇到此错误,显然这并没有发生。

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

      窗口

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

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

      从 JRE 根运行递归解压缩所有 .pack 文件:

      for /r %f in (*.pack) do "%JAVA_HOME%\bin\unpack200.exe" -r -q "%f" "%~pf%~nf.jar"
      

      *尼克斯

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

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

      从 JRE 根运行递归解压缩所有 .pack 文件:

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

      可能性 2

      您以其他方式错误安装了 Java。也许您在没有管理员权限的情况下安装,或者试图简单地从安装程序中提取文件。使用安装程序和/或更多权限重试。或者,如果您不想使用安装程序,请改用.tar.gz Java 包。

      【讨论】:

      • 这是一个 Solaris 问题,而不是 Windows。
      • 如果您只是下载 java linux 存档文件,并且不想使用安装脚本,此解决方案会有所帮助。
      • @Robin Kanters 作为这个确切的问题/错误消息,其症状和修复方法与平台无关,这是一个 Java RE 问题,而不是 Solaris。跨度>
      • 确认在java做了一些自动更新后在windows上遇到这个问题
      • 我总是只使用for %i in (*.pack) do (..\bin\unpack200 "%i" "%~ni.jar" & del "%i")(也许有一天我会让它更健壮一点,这样我就不必手动更改路径了,但话又说回来,我通常只使用.gz 不打包它们的 JRE 版本。)
      【解决方案5】:

      在 Windows 10 上,我遇到了与 JRE 1.8 (8u121) 相同的问题。
      打字

      java -version
      

      cmd 提示符返回

      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 的链接。

      之后,检查C:\Windows\System32中是否存在java.exe文件;如果为真,则删除该文件。

      现在输入java -version 可以正常工作。

      【讨论】:

      • 我在 Windows 更新后遇到了同样的问题,但是我没有文件夹 C:\Program Files\Java Folder\bin。相反,我使用C:\Program Files\Java\jdk1.8.0_161\bin,但无论如何它对我没有帮助。文件夹 System32 中没有文件 java.exe
      【解决方案6】:

      所以,我继续尝试一切,最后似乎在卸载 java 后重新安装它解决了我的问题。

      【讨论】:

        【解决方案7】:

        这解决了我在 CentOS 上遇到的问题

        sudo yum install java-1.8.0-openjdk-devel
        

        另见setting JAVA_HOME & CLASSPATH in CentOS 6

        【讨论】:

          【解决方案8】:

          在窗口 10 中,env 中已经有一个路径为 C:\>ProgramData\Oracle\Java\javapath,其中包含指向可执行文件的符号链接。

          当我安装一个新版本并将其从我的环境变量中删除时,我的所有项目都会开始显示它。

          我在窗口 10 中使用日食氧气

          解决它:-

          1. 我只是从环境变量中删除路径 C:\>ProgramData\Oracle\Java\javapath 并在路径中添加新的 env 作为 JAVA_HOME 和 %JAVA_HOME%/bin

          2. 我用管理员权限重新安装jdk(删除之前的JRE文件夹)

          3. 打开您的 Eclipse 项目 > 右键单击​​ > 转到属性 > 在库中 > 现在删除 JRE 系统库 > 单击添加库 > 选择“JRE 系统库” > 单击下一步 > 选择“工作区默认 JRE(jre1.8.x_xxx )" > 完成

          我的问题解决了 :) 希望对你有帮助:)

          【讨论】:

            【解决方案9】:

            快速解决方案,适合不耐烦的人 ;) 在 Windows 机器上,试试这个: 转到C:\Windows\System32 目录并删除java.exe(或将其重命名为java.exe.old)。

            至少从 1.6 开始,Windows 目录中不应有 java.exe。如果有,那是某物的剩余物。

            多读一点:

            我真的很惊讶 2012 年的一个问题还没有得到批准的答案,而我实际上在 2015 年在我的 Win 7 32 位操作系统上遇到了同样的问题!

            那么到底发生了什么?

            基本上,一切正常,我下载了 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 Console (Command Line) 也可以正常工作!

            致谢转到本论坛的最后一篇帖子: https://bukkit.org/threads/java-lang-noclassdeffounderror-java-lang-object.70450/

            【讨论】:

            • 我也面临这个问题,但在您的情况下,您似乎只是在使用旧版本的 java。 1.6.0_26 != 1.6.0_45,您的旧版本可能没有问题。
            • 好发现!我安装了 JDK 1.6.0_26,并且“较新”版本来自 Windows System32 文件夹。两者都在 PATH 环境变量中,我实际上不想使用 Windows 提供的 java 运行时。因此,删除它解决了这个问题。也许您的 PATH 中也有两个 java 运行时?
            • 对我来说,我的安装缺少 rt.jar(您可以在其中找到 java.lang.Object)。不幸的是,当我从 kickstart 安装 RPM 时,它缺少 rt.jar,但如果我在它之后安装,就会遇到一个有趣的问题。
            • 我无法帮助您处理 RPM。对此感到抱歉。
            • 对我来说,C:\ProgramData\Oracle\Java\javapath 中的 java 符号链接导致了问题。我更改了 PATH 环境变量,现在它可以工作了。
            【解决方案10】:

            刚刚在 Solaris 上执行此操作,遇到了同样的问题,即使“java -version”也不起作用。发行版的 64 位版本远小于 32 位版本是有原因的。确实如上所说:

            换句话说,要获得完全工作的 64 位安装,您必须首先运行 32 位安装,如果您有一台支持 64 位的机器,然后安装 64 位...

            所以我运行了 32 位的安装程序:

            sh jdk-6u131-solaris-sparc.sh

            然后我运行了 64 位的安装程序:

            sh jdk-6u131-solaris-sparcv9.sh

            这给了我几个可供选择的 java 可执行文件:

            • $ 查找 . -name java
            • ./jdk1.6.0_131/db/demo/programs/scores/java
            • ./jdk1.6.0_131/db/demo/programs/vtis/java
            • ./jdk1.6.0_131/bin/java
            • ./jdk1.6.0_131/bin/sparcv9/java
            • ./jdk1.6.0_131/jre/bin/java
            • ./jdk1.6.0_131/jre/bin/sparcv9/java

            sparcv9 java 是 64 位版本,当与 32 位 JDK 一起安装时,它们使用“-version”。

            • ./jdk1.6.0_131/bin/sparcv9/java -version
            • java版本“1.6.0_131”
            • Java(TM) SE 运行时环境(内部版本 1.6.0_131-b32)
            • Java HotSpot(TM) 64 位服务器 VM(内部版本 20.131-b32,混合模式)

            -丹

            【讨论】:

            • 没错,但问题是从 2012 年开始的,我们不知道 OP 的平台。他指的是/usr/java,所以它显然是一个类似Linux/Unix的操作系统。你是对的,Java 的 Solaris 安装与 Java8 之前的任何其他操作系统都不同。您基本上必须先安装 32 位软件包,然后再安装 顶部 的 64 位软件包。但现在 Solaris 不再支持 32 位 Java,就像 Mac OS X 一样,这一切都已成为过去。
            【解决方案11】:

            进入控制面板,卸载java相关的东西(如果打开则关闭eclipse),然后重新安装java并打开eclipse,清理项目。

            【讨论】:

            • 投反对票。 OP 显然在 Windows 平台上。
            【解决方案12】:

            只需安装 jre 再次。它简单地解决了我的问题。 (SonarQube启动批处理我安装jdk后开始报这个错误)

            【讨论】:

              【解决方案13】:

              我遇到了同样的问题,我安装了两个 java 版本,因此导致了这个问题。要确认这一点,请单击控制面板中的 java 图标,如果未打开则问题相同,只需卸载一个版本即可。小菜一碟。谢谢。

              【讨论】:

                【解决方案14】:

                我遇到过类似的问题,发现程序数据中的符号链接(C:\ProgramData\Oracle\Java\javapath)是错误的。我已经给出了正确的路径并且它有效。

                Details on how to correct the program data is available here

                【讨论】:

                  【解决方案15】:

                  我遇到了同样的问题:VM 初始化期间发生错误 java/lang/NoClassDefFoundError: java/lang/Object

                  按照以下步骤解决问题:

                  步骤 1. 转到 C:\Program Files\ 并搜索 Java 文件夹。

                  步骤 2. 删除 C:\Program Files\Java 文件夹。

                  第 3 步。从 http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载适用于您的 32 位/64 位版本的新 Jdk

                  步骤 4. 安装 JDK

                  第 5 步:现在将 JAVA_HOME 设置为“C:\Program Files\Java\jdk1.8.0_91”

                  第 6 步:打开命令提示符并输入 java -version。

                  有效。

                  【讨论】:

                  • OP 提到 JAVA_HOME 不是这里的问题
                  • 如果JAVA_HOME已经设置为jdk位置,则无需再次配置。您可以直接跳过第 5 步。只需删除旧的 JDK 并安装新的。
                  【解决方案16】:

                  就我而言,我使用的是windows 8.1(安装了jdk1.8.0_77),我做了三件事:

                  1. 我删除了以前的 jdks
                  2. 我重命名了 C:\Windows\System32 中的 java.exe 文件
                  3. 我还在我的 PATH 中删除了 C:\ProgramData\Oracle\Java\javapath (echo %PATH%)

                  瞧,把它修好了!

                  【讨论】:

                    【解决方案17】:

                    我今天下载了新的JDK(1.8.0.73)开始c:> java.exe,得到了臭名昭著的:

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

                    我只是想在这里分享我的工作解决方案。

                    当我 cd'ied 进入 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,问题就消失了。快乐编码...

                    【讨论】:

                      【解决方案18】:

                      我在解压.rpm文件时发现这个错误。

                      然后我删除了该文件夹并下载了适用于 Linux 64 的 jdk-7u79-linux-x64.tar.gz 并提取了该文件的内容。 还: 导出 JAVA_HOME=/opt/java/jdk1.7.0_79 导出 JDK_HOME=/opt/java/jdk1.7.0_79 导出 PATH=${JAVA_HOME}/bin

                      【讨论】:

                        【解决方案19】:

                        对我有用的快速修复:

                        for file in $(find "$JAVA_HOME" -name "*pack")
                        do 
                            unpack200 "${file}" "${test_file/%pack/jar}";
                        done
                        

                        【讨论】:

                          【解决方案20】:

                          如果您安装 64 位版本而没有先安装 32 位,尽管已修复所有其他问题,但仍会出现此错误。我有一台运行 Java 8u71 的全新 Dell i7 64 位 Windows 10 Pro 机器。在将我的 %path% 和 %classpath% 添加到环境变量并尝试其他几个修复后,卸载 64 位,安装 32 位,然后重新安装 64 位修复它。

                          一些已被提及为可能原因的问题(例如未解包文件等)可能仍会导致问题,但如果您不这样做,其他修复也将不起作用。

                          【讨论】:

                            【解决方案21】:

                            我最近遇到了同样的问题。在我的情况下,我的 Windows 7 机器自动下载了 java 并将 C:\ProgramData\Oracle\Java\javapath 添加到我的路径环境变量的开头,这弄乱了我的 java。一旦我从路径中摆脱了它,它就起作用了。

                            【讨论】:

                              【解决方案22】:

                              当您通过_uncompressing_ 它而不是_executing_ 它安装JDK 时会发生此问题。

                              举例:

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

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

                              【讨论】:

                                【解决方案23】:

                                不能只安装64位,必须先安装32位,再添加64位组件。

                                来自 java.com:

                                在允许 32 位 JVM 的 64 位系统上安装 JRE 是一个两步过程:首先安装 32 位 JRE,然后安装对 64 位操作的附加支持。文件名如下:

                                【讨论】:

                                • OP 没有提到在 64 位系统上运行 32 位 JVM...?
                                【解决方案24】:

                                如果您在 java 二进制文件上执行“chmod u+rx”并运行它,它将解压缩 jar 文件,您可以执行 java -version 而不会出现运行时错误

                                【讨论】:

                                  【解决方案25】:

                                  您很可能在安装中缺少一个名为 rt.jar 的文件,该文件包含 java.lang.Object 的类文件。检查您的安装文件等。

                                  请特别注意,64 位安装程序会覆盖(或安装“旁边”)现有的 32 位安装。换句话说,要获得完全工作的 64 位安装,您必须首先运行 32 位安装,如果您有一台支持 64 位的机器,然后再安装 64 位...

                                  如果您只进行 64 位安装,您将在安装中丢失某些文件,并会出现上述错误。

                                  【讨论】:

                                  • 这是答案的一部分。您需要解压缩 java SDK 路径的 /lib 和 lib/ext 目录中的所有 *.pack 文件。 unpack200 可以帮助您解决这个问题。请参阅 Rigg802 的评论。
                                  【解决方案26】:

                                  我在使用 JDK 1.7.0_40 i586 安装 x86_64 Linux 时遇到了一些问题。 我发现问题在于 rpm 无法解压缩 jar 文件,正如 Rigg802 所提到的(尽管 rpm 完成了标记成功):

                                  Unpacking JAR files...
                                          rt.jar...
                                  /var/tmp/rpm-tmp.zLzkkb: /usr/java/jdk1.7.0_40/bin/unpack200: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
                                  Error: unpack could not create JAR file:
                                  
                                          /usr/java/jdk1.7.0_40/jre/lib/rt.jar
                                  

                                  文件 /lib/ld-linux.so.2 由 glibc-2.12-1.107.el6_4.4 提供。i686 不在 jdk rpm 的 rpm deps 中。

                                  Oracle JDK rpm 还需要安装 32 位版本的 libgcc-4.4.7-3.el6。i686 才能安装

                                  所以,解决方法是先安装 glibc-2.12-1.107.el6_4.4.i686 和 libgcc-4.4.7-3.el6.i686。

                                  【讨论】:

                                  • 我在 Fedora 20 上遇到了同样的问题,安装 libgcc-4.8.2-7.fc20.i686 它解决了这个问题。发送
                                  【解决方案27】:

                                  另一个答案可能是在 Linux 案例中使用 tar.gz 文件。 solaris 平台似乎也有类似的东西。这样所有文件都已经是预期的格式,不会有任何解包问题。

                                  【讨论】:

                                  • 使用 tar.gz 文件是什么意思?
                                  • 考虑到我在大约 2.5 年前回答了这个问题,我不得不回顾一下 java 下载站点。在那里,您可以选择将 java 下载为 Linux 的 .rpm 之类的打包文件。我想我以前尝试过,但遇到了麻烦。相反,下载 tar.gz 文件效果更好,因为其中包含所需文件格式的所有内容。
                                  【解决方案28】:

                                  对于 64 位架构,您似乎必须同时安装 32 位版本和 64 位版本的 jre(架构独立文件如 rt.jar 仅在 32 位版本中分发)。

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

                                  【讨论】:

                                  • 你从哪里得到的architecture independent files as rt.jar are distributed only in the 32-bin version
                                  • 我刚刚检查了分发的内容
                                  • +1 是的,你是对的。 rt.jar 不包含在用于 solaris 64 位的 jre 包中。
                                  • 补充一点——我们在 SmartOS 上手动安装时遇到了这个问题。按照blogs.oracle.com/thefield/entry/solaris_11_jdk_installation 的说明进行操作(大部分情况下),您会没事的。
                                  • 我安装了 jdk-7u79-solaris-sparcv9.tar.Z 和 jdk-7u79-solaris-sparc.tar.Z 两个包。现在看起来它正在工作。泰。
                                  猜你喜欢
                                  • 1970-01-01
                                  • 2019-11-05
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2012-03-16
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多