Java,UnsupportedClassVersionError。我该如何解决这个问题?

3

我在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。 - Nate W.
1
@Shakedown 为什么?它们是等价的,而且这不是他的问题。 - Travis Webb
1
OpenJDK 7 不是新的真正(Sun/Oracle)JDK吗?而 OpenJDK 6 是在 Oracle 6 和 OpenJDK 7 之间开发的东西? - Dennis
它们绝对不等价......如果它们是等价的,那么为什么会存在呢。很有可能你是对的,它与此无关,但我曾经遇到过使用OpenJDK导致的困难错误。 - Nate W.
OpenJDK 6和Oracle 6并不相同。正确的。我也遇到了问题。因此,直到现在我才没有涉及OpenJDK 7。 - Dennis
@Dennis,自从“Java” 7以来,OpenJDK成为Oracle JDK的基础,因此它们现在完全兼容。确实,在OpenJDK 6之前存在问题。 - Matthieu
6个回答

6

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


3
也许您在eclipse中的编译器不同?请进入偏好设置->编译器,检查编译器级别。也许是Java 7?
如果您使用Linux系统,则可以查看所有已安装的运行时环境:update-alternatives --config java。在这里,您可以选择正确的运行时环境,应该能够找到OpenJDK 7。

尽管运行了update-alternatives以使用Java 6安装程序来执行所有Java相关命令,但我在编译Java 6兼容的类文件时遇到了一些问题。然后我意识到我已经将JAVA_HOME环境变量(在/ etc / environment中)设置为我的Java 7安装。将其更改为Java 6的相应目录解决了问题。 - joelpet

2

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

javac -version 6 ...

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

1
请注意,在这种情况下,您必须确保只调用Java SE 6 API。以下是一些跨编译的提示:http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#crosscomp-options最简单的交叉编译方式可能是使用JDK 6和JDK 7(如果需要),分别在您的持续集成服务器上设置相应的作业(例如Jenkins)进行编译。 - Puce
如果你在Java 6编译器中使用“-version 5”,可能会遇到麻烦(我不记得具体是什么了,那是几年前的事了)。 - Dennis

1

你是否可能已经使用Java 7编译了你的测试程序,现在正试图在终端中运行它来兼容Java 6?如果是这种情况,我建议你尝试在终端中重新编译(即Java 6),然后再尝试重新运行程序。


但是你能用1.5的运行时来运行1.6程序吗?我认为这就是问题所在——向后兼容性,除非你采用发射1.6兼容字节码的建议。不过我可能错了,所以很乐意接受纠正。 - speedRS
@Dennis 在正常情况下是这样的,但总会有一些例外。比如这个 :) - vedran
2
@vedran是错误的。您永远无法在1.6运行时中运行1.7编译的程序。您可以运行1.5程序,因为1.5的功能集是1.6的子集,而1.7的功能集是1.6的超集 - Travis Webb
@speedRS 没错,他是针对7进行编译的,但在6上运行。我在你的评论中读到了相反的情况。抱歉。 - Dennis
1
为什么这很奇怪?如果您尝试使用比运行时环境更新的编译器,则您正在错误地进行操作。JDK是向前兼容的,JRE是向后兼容的。这是设计上的考虑。 - Travis Webb
显示剩余3条评论

1
在Eclipse中,转到Window-->Preferences-->Java-->Compiler,您将看到一个标记为“编译器兼容级别”的字段。将其设置为1.6,然后在Eclipse中重新编译。
Eclipse和您的命令行javac之间存在Java版本不匹配。具体来说,您的javac似乎正在使用64位1.6。 Eclipse显然正在使用1.7。

0
如果上述解决方案都已设置好,但仍然遇到相同的问题,并且您正在使用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. version: 3.16.1-GA

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