无法执行Java程序:UnsupportedClassVersionError

我已经安装了JDK 6,但是我无法执行Java程序。

例如,我已经制作了test.java。 我用javac tes.java编译它,编译时没有错误,但是当我想执行该程序时,它总是显示错误。 我用java tes执行Java程序。

 Exception in thread "main" java.lang.UnsupportedClassVersionError: tes : 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: tes. Program will exit. 

我的javac版本是1.7.0,我的java版本是1.6.0。

这是我的tes.java代码:

 class tes{ public static void main(String[]args){ System.out.println("hello"); } } 

看起来您已经使用较新版本的Java(7)编译了Java源代码,旧版Java运行时无法执行该版本(6)。 如果您不需要/想要Java 7,请卸载openjdk-7-jdk软件包并安装openjdk-6-jdk

 sudo apt-get remove openjdk-7-jdk sudo apt-get install openjdk-6-jdk 

另一种方法是使用指向编译器或运行时的特定版本的直接路径:

运行Java 7运行时

Java 6仍然是默认设置(与旧程序的兼容性?)。 要强制使用Java 7运行时,请使用它的直接路径:

 /usr/lib/jvm/java-7-openjdk-amd64/bin/java tes 

(用32位版本的Java替换i386 amd64

运行Java编译器版本6

如果要为Java版本6编译代码,请使用Java 6编译器的完整路径:

 /usr/lib/jvm/java-6-openjdk/bin/javac tes.java 

备择方案

就像我之前说过的,如果你不喜欢版本7或6,请将其卸载( openjdk-7-jdkopenjdk-7-jre用于版本7, openjdk-6-jdkopenjdk-6-jre用于版本6 )。 可以安装两个版本。 使用替代系统配置默认系统。 运行以下命令以配置运行时和编译器。 它将为您提供默认选项。

 sudo update-alternatives --config java sudo update-alternatives --config javac 

请看一下这个Java.net线程http://www.java.net/node/664117

总之,当您使用一个版本的JDK编译代码,然后尝试在旧版本的JDK上运行已编译的代码时,会发生这种情况。 因此,例如,如果使用JDK6编译代码但尝试使用JDK5运行它,则会出现此错误。

如果您在同一台PC上编译并运行test.java,请比较以下命令的输出。 我相信他们会给出单独的版本号。

 javac -version java -version 

如果要在一台PC上进行编译然后在另一台PC上运行,则将编译的PC中的第一个命令的输出与运行程序的PC的第二个命令的输出进行比较。

如果您将此版本信息添加到您的问题中,它也会有所帮助。

每个生成的类文件都有一个主要版本和次要版本。 因为特定的jvm支持主要版本和次要版本范围内的范围。 因此,您编译的类文件具有比您的jvm支持更高的版本。 现在您有两个选择,您可以使用“1.6 java compiler”或“1.7 java”。

尝试了以上所有,如果它仍然无法正常工作。 尝试执行以下命令的文件:

 javac tes.java java -cp "." tes 

未设置CLASSPATH变量时会观察到此类错误。 即使我有同样的问题。 不能只是执行它。 使用上面的命令它确实有效。

有关CLASSPATH的更多信息。

您写道,您尝试使用javac tes.java编译文件test.java – 这将无法独立于您的JDK,因为*.java文件名必须与其类的名称相匹配; 我假设没有tes.java file 。 那么, javac test.java吗?

来自javac页的其他信息:

“源代码文件名必须具有.java后缀,类文件名必须具有.class后缀, 源文件和类文件都必须具有标识该类的根名称。例如, 名为MyClass将写入名为源文件中MyClass.java并编译成一个名为MyClass.class字节码类文件 。“

使用sudo update-alternatives --config java并设置您可能想要使用的版本。