我已经安装了JDK 6,但是无法执行Java程序。
例如,我创建了 test.java。我用 编译它,javac tes.java
编译时没有错误,但是当我想要执行该程序时,它总是显示错误。我用 执行 Java 程序java tes
。
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");
}
}
答案1
看起来您已使用较新版本的 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,请将其替换amd64
为)i386
运行 Java 编译器版本 6
如果要针对 Java 版本 6 编译代码,请使用 Java 6 编译器的完整路径:
/usr/lib/jvm/java-6-openjdk/bin/javac tes.java
备择方案
就像我之前说过的,如果你不喜欢版本 7 或 6,请卸载它(openjdk-7-jdk
对于openjdk-7-jre
版本 7openjdk-6-jdk
和openjdk-6-jre
版本 6)。可以同时安装两个版本。使用替代系统配置默认版本。运行以下命令来配置运行时和编译器。它将为您提供默认选项。
sudo update-alternatives --config java
sudo update-alternatives --config javac
答案2
请查看此 Java.net 线程http://www.java.net/node/664117
总之,当您使用某个版本的 JDK 编译代码,但尝试在旧版本的 JDK 上运行编译后的代码时,就会发生这种情况。例如,如果您使用 JDK6 编译代码,但尝试使用 JDK5 运行它,就会出现此错误。
如果您在同一台电脑上编译并运行 test.java,请比较以下命令的输出。我相信它们会给出不同的版本号。
javac -version
java -version
如果您在一台 PC 上进行编译,然后在另一台 PC 上运行,则请将编译所在的 PC 上的第一个命令的输出与运行程序所在的 PC 上的第二个命令的输出进行比较。
如果您将此版本信息添加到您的问题中也会有所帮助。
答案3
每个生成的类文件都有一个主版本和次版本。因为特定的 jvm 支持主版本和次版本之间的范围。所以您编译的类文件具有比 jvm 支持的版本更高的版本。现在您有两个选择,您可以使用“1.6 java 编译器”或“1.7 java”。
答案4
test.java
您写道,您尝试使用编译文件javac tes.java
- 这无法独立于您的 JDK 工作,因为*.java
文件名必须与其类的名称匹配;并且我认为没有tes.java file
。那么,可以javac test.java
工作吗?
来自联机帮助页的附加信息javac
:
“源代码文件名必须带有 .java 后缀,类文件名必须带有 .class 后缀,并且源文件和类文件都必须具有标识类的根名称。例如,名为 MyClass 的类将会写成源文件名为MyClass.java并编译成名为 MyClass.class 的字节码类文件“”。