【问题标题】:Java, UnsupportedClassVersionError. How can I fix thisJava,UnsupportedClassVersionError。我怎样才能解决这个问题
【发布时间】:2011-12-02 00:32:59
【问题描述】:

我在 Eclipse 中做作业,它没有报告任何错误,甚至没有警告。当我尝试从终端编译它时,出现以下错误。它可以使用 eclipse 运行和编译。我认为它与java版本有关吗?无论如何要修复它或尝试绕过它?

vedran@vedran-debian:~/java/oop/Aufgabe6$ java Test 
Exception in thread "main" java.lang.UnsupportedClassVersionError: Test : Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: Test. Program will exit.

Java 版本:

java version "1.6.0_23" 
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-1) 
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode) 

编辑:

谢谢大家的解释。这似乎是一个 java6/7 问题。我刚刚用 1.6 编译它,它就像魅力一样。

【问题讨论】:

  • 呃,OpenJDK?你需要用那个吗?否则我强烈推荐使用真正的 java JDK。
  • @Shakedown 为什么?他们是等价的,这不是他的问题。
  • OpenJDK 7 不是新的真正 (Sun/Oracle) JDK 吗? OpenJDK 6 是在 Oracle 6 和 OpenJDK 7 之间开发的东西?
  • 它们绝对不相等......如果它们是那么为什么会存在。您可能是对的,这与此无关,但我遇到了最终由使用 OpenJDK 引起的困难错误。
  • OpenJDK 6 和 Oracle 6 不一样。正确的。我也遇到了问题。所以直到现在我才接触 OpenJDK 7。

标签: java version


【解决方案1】:

Test.class 文件已在 Java 7(主要/次要版本 51.0)中编译,因此它与 Java 6(主要/次要版本 50.0)运行时不兼容。在 Java 6(或更早版本)中编译 .java 文件,或者在 Java 7 运行时中运行 .class。

【讨论】:

    【解决方案2】:

    也许您在 Eclipse 中的编译器有所不同?首选项 -> 编译器:编译器级别。也许是 Java 7?

    如果您在 Linux 下,可以查看所有已安装的运行时环境:update-alternatives --config java。在这里你可以选择正确的。在这里你应该可以找到 OpenJDK 7。

    【讨论】:

    • 我在编译 Java 6 兼容的类文件时遇到了一些麻烦,尽管运行 update-alternatives 以对所有 Java 相关命令使用 Java 6 安装。然后我意识到我已将 JAVA_HOME 环境变量(在 /etc/environment 中)设置为我的 Java 7 安装。将其更改为 Java 6 的相应目录可以解决问题。
    【解决方案3】:

    51.0 表示 Java 版本 7,因此您尝试运行的类文件是使用版本 7 编译器编译的。如果您需要使用版本 6 的 JVM 运行代码,您应该指示编译器发出版本 6 兼容的字节码。

    javac -version 6 ...
    

    该命令行参数将强制更高版本的编译器将其输出限制为与版本 6 运行时环境兼容的字节码。

    【讨论】:

    • 但是请注意,在这种情况下,您必须确保您只调用 Java SE 6 API。这里有一些交叉编译的技巧:docs.oracle.com/javase/7/docs/technotes/tools/windows/… 最简单的交叉编译方法可能是使用 JDK 6 编译一次,使用 JDK 7 编译一次(如果需要),每个都通过在您的连续集成服务器上设置一致的作业(例如詹金斯),
    • 如果您将-version 5 与 Java 6 编译器一起使用,您可能会遇到麻烦(我不记得具体是什么。那是几年前的事了)。
    【解决方案4】:

    在 Eclipse 中,转到 Window-->Preferences-->Java-->Compiler,您将看到一个标有“Compiler compliance level”的字段。设置为1.6,在Eclipse中重新编译。

    Eclipse 和您的命令行javac 之间存在Java 版本不匹配。具体来说,您的 javac 似乎使用的是 64 位 1.6。 Eclipse 显然使用的是 1.7。

    【讨论】:

      【解决方案5】:

      您是否已经编译了测试程序 Java 7,现在正尝试在终端中针对 Java 6 运行它?如果是这种情况,我会尝试在终端(即 Java 6)中重新编译,然后尝试重新运行程序。

      【讨论】:

      • 这应该不是问题,还是?我的意思是,我可以用我的 1.6 运行我的 1.5 程序。
      • 但是您可以使用 1.5 运行时运行 1.6 程序吗?我认为这就是这里的问题 - 向后兼容性,除非您接受发出 1.6 兼容字节码的建议。虽然很高兴得到纠正,但我可能是错的。
      • @Dennis 在正常情况下是的,但一如既往有一些例外。例如这个:)
      • @vedran 是错误的。您可以永远使用 1.6 运行时运行 1.7 编译的程序。您可以运行 1.5 程序,因为 1.5 的功能集是 1.6 的 子集,而 1.7 的功能集是 1.6 的超集
      • 为什么奇怪?如果您尝试使用比运行时环境更新的编译器,那么您做错了。 JDK 向前兼容,JRE 向后兼容。这是设计使然。
      【解决方案6】:

      如果上面的解决方案都设置好了,如果你仍然有同样的问题并且 如果您使用的是 MAVEN,请检查 pom.xml。如果您使用 jdk 1.6,则 JAVA ASSIST JAR 应指向 16.1-GA,否则应为您指向的 jdk 添加相应版本。(例如:jdk 7 为 3.17.1)。对于 jdk 6,请添加具有以下详细信息的依赖项

      1. groupId : org.javassist
      2. artifactId:javassist
      3. 版本:3.16.1-GA

      【讨论】:

        猜你喜欢
        • 2013-10-24
        • 1970-01-01
        • 2019-04-10
        • 2012-03-16
        • 2020-11-28
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 2020-02-21
        相关资源
        最近更新 更多