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

Linuxで別のバージョンのJavaを使用してクラスをコンパイルし、別のバージョンのJavaで実行したため、エラーが発生します。

LinuxのJavaは、コンパイルに使用されたものと比較して古いバージョンである可能性があります。

プラットフォームの独立性を試すには、LinuxonWindowsでコンパイルした.classファイルを実行します。

于 2012-09-04T16:20:21.757 に答える
1

クロスバージョンで動作させるには、コンパイラのクロスコンパイルオプションを使用する必要があります。正しく実行されれば、コードはJava 7 SDKでコンパイルされ、1.1 JREで実行できるようになります(見つけられると仮定します)。

于 2012-09-04T16:49:24.280 に答える
1

UbuntuボックスにインストールしたJREのバージョンは、ファイルをコンパイルしたJDKのバージョンよりも前です。特にJava751.0に対応していると思いますので、Ubuntuにはバージョン6がインストールされていると思います。

バイトコード形式はすべてのマシンで同じです。ただし、もちろん、これは将来のバージョンには当てはまりません。新しい機能が導入されると、以前のバージョンのJVMはそれらを理解できなくなります。Java 7で使用されるバイトコードの形式は、v6JVMでは理解されていません。

(ちなみに、このテストを逆に実行した場合、Linuxでバージョン6バイトコードをコンパイルし、Java 7 Windows VMでクラスを実行した場合、正常に実行されます。)

于 2012-09-04T16:21:04.987 に答える