Java,不支持ClassVersionError。我怎样才能解决这个问题

Java,不支持ClassVersionError。我怎样才能解决这个问题,java,version,Java,Version,我在eclipse中做作业,它没有报告任何错误,甚至没有警告。当我试图从终端编译它时,我得到了以下错误。它可以在eclipse中正常运行和编译。我想这和java版本有关吧?不管怎么说,是修复它还是尝试绕过它 vedran@vedran-debian:~/java/oop/Aufgabe6$ java Test Exception in thread "main" java.lang.UnsupportedClassVersionError: Test : Unsupported major.m

我在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编译了它,它工作得很好。

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

javac -version 6 ...

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

也许eclipse中的编译器不同?首选项->编译器:编译器级别。也许是Java 7


如果您使用的是Linux,则可以查看所有已安装的运行时环境:
更新备选方案--config java
。在这里你可以选择正确的一个。在这里,您应该能够找到OpenJDK 7。

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

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

在Eclipse中,转到窗口-->首选项-->java-->编译器,您将看到标记为“编译器符合性级别”的字段。将其设置为
1.6
,然后在Eclipse中重新编译


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

如果上述解决方案都已设置好,那么您是否仍然存在相同的问题,并且 如果您正在使用MAVEN,请签入pom.xml。如果您使用的是JDK1.6,JAVA ASSIST JAR应该指向16.1-GA,否则应该为您所指向的jdk添加相应的版本。(例如:3.17.1对于JDK7)。对于JDK6,添加具有以下详细信息的依赖项

  • groupId:org.javassist
  • artifactId:javassist
  • 版本:3.16.1-GA

  • Eghh,OpenJDK?你需要用那个吗?否则我强烈建议使用真正的JavaJDK。@为什么?它们是等价的,这不是他的问题。OpenJDK 7不是新的真正的(Sun/Oracle)JDK吗?OpenJDK 6是Oracle 6和OpenJDK 7之间正在开发的东西?它们绝对不是等价的……如果它们是等价的,那么它为什么会存在呢。很可能你是对的,这与此无关,但我遇到了一些困难的错误,这些错误最终是由使用OpenJDK引起的。OpenJDK 6和Oracle 6是/不是相同的。对的我也有问题。因此我直到现在才接触OpenJDK 7。这应该不是问题,或者?我的意思是,我可以用我的1.6运行我的1.5程序,但是你能用你的1.5运行时运行1.6程序吗?我认为这就是这里的问题——向后兼容性,除非您同意发出1.6兼容字节码的建议。“我可能错了,尽管我很高兴被纠正。”丹尼斯在正常情况下是的,但总有一些例外。例如:)@vedran是错误的。您永远不能使用1.6运行时运行1.7编译的程序。您可以运行1.5程序,因为1.5的featureset是1.6的子集,而1.7的featureset是1.6的超集。为什么奇怪?如果您试图使用比运行时环境更新的编译器,那么您就错了。JDK是向前兼容的,JRE是向后兼容的。但请注意,在这种情况下,您必须确保只调用JavaSE6API。这里有一些交叉编译的技巧:交叉编译最简单的方法可能是用JDK 6编译一次,用JDK 7编译一次(如果需要的话),每种方法都是在您的连续集成服务器(如Jenkins)上设置相应的作业。如果您在Java 6编译器上使用
    -version 5
    ,您可能会遇到麻烦(我不记得具体是什么了。那是几年前的事了)。尽管运行了更新替代方案来为所有与Java相关的命令使用Java 6安装,但我在编译Java 6兼容的类文件时遇到了一些问题。然后我意识到我已经设置了Java_HOME环境变量(在/etc/environment中)到我的Java7安装。将其更改为Java6的相应目录修复了该问题。