无法执行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-jdk
和openjdk-7-jre
用于版本7, openjdk-6-jdk
和openjdk-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
并设置您可能想要使用的版本。