1

我想测试一下java的平台独立性,所以我用java写了hello world程序,用windows的编译器编译,生成HelloWorld.class文件。然后我尝试在linux(ubuntu)中运行该文件。我最终出现错误。(JRE已经安装在linux中)

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

然后我使用 linux 编译器编译了相同的程序,并使用该 .class 文件检查它是否在 windows 中运行。它运行良好。

据我所知,由于字节码文件(.class)与平台无关,因此该程序应该可以完美运行。当我尝试在 linux 中运行该程序时出了什么问题?

4

4 回答 4

5
HelloWorld : Unsupported major.minor version 51.0

说您的编译器版本与运行时 java 版本不同。

我的理解

java平台独立性

您还需要在运行时机器上拥有与类文件编译器版本兼容(相同(或)更高)的 JVM。

于 2012-09-04T16:19:02.320 回答
2

您收到错误是因为您使用不同版本的 Java 编译了该类,并在 Linux 中在不同版本的 Java 中运行它

与用于编译的版本相比,Linux 中的 Java 很可能是旧版本。

要尝试平台独立性,请在 Windows 上运行您在 Linux 上编译的 .class 文件

于 2012-09-04T16:20:21.757 回答
1

您在 Ubuntu 机器上安装的 JRE 版本早于编译您的文件的 JDK 版本。我相信特别51.0对应于 Java 7,因此您可能在 Ubuntu 上安装了版本 6。

没错,所有机器的字节码格式都是相同的。但是,当然,在未来的版本中,情况并非如此;随着新特性的引入,以前版本的 JVM 无法理解它们。v6 JVM 不理解 Java 7 中使用的字节码格式。

(顺便说一句,如果您以另一种方式执行此测试 - 在 Linux 中编译版本 6 字节码并在您的 Java 7 Windows VM 上运行该类,它会成功运行。)

于 2012-09-04T16:21:04.987 回答
1

让它跨版本工作都归结为使用编译器的交叉编译选项。如果正确完成,代码可以在 Java 7 SDK 上编译并适合在 1.1 JRE 上运行(假设您可以找到一个)。

于 2012-09-04T16:49:24.280 回答