3

1.5および1.6を使用してコンパイルされたコードは1.4JREで実行されますか?1.4JREがサポートするJavaバージョンがわかりませんでした。

問題のコードが1.5または1.6でサポートされている機能を実装している場合、それは間違いなくコンパイルされません...そして「逆コンパイル」にはいくつかのリスクがありますが、1.4JREがロードさえ拒否するかどうかはわかりませんでした1.5/1.6コンパイルされたクラスかどうか。


更新java.lang.UnsupportedClassVersionErrorJRE 1.4で1.6クラスファイルを実行すると、例外が発生することを確認しました。

4

8 に答える 8

8

クロスコンパイルできます。このドキュメントでは、次の方法について説明します。

http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html#crosscomp-example

ターゲットとする特定のメジャーバージョンを指定する必要があります(1.4、そのように聞こえます)。

この手法を使用する場合、最善の策は、常に最新のjavacを使用することです。そうすれば、最新のバグ修正とパフォーマンスの改善がすべて得られ、完全に安全です。

編集:これは、いくつかの回答で議論されたライブラリの非互換性の問題に対処していることに注意してください!

于 2009-11-10T20:29:07.683 に答える
5

javac -target 1.4switchでコンパイルする場合のみ。

明らかに、ジェネリックス、エグゼキューターなどの1.5以上の機能を使用することはできません。

于 2009-11-10T20:28:18.970 に答える
4

デフォルトの1.6でビルドしただけの場合javac、クラスファイルは古いバージョンのJavaでは機能しません。

古いJava用にコンパイルする最良の方法は、古いJDKリリースを使用することです。しかし、本当に古いJavaを新しいものからコンパイルしたい場合は、次の手順を実行してください。

于 2009-11-10T20:35:27.677 に答える
1

http://en.wikipedia.org/wiki/Java_backporting_toolsにも興味があるかもしれません

于 2009-11-10T20:48:44.227 に答える
0

はいといいえ。コンパイル時に「source」および「target」javacオプションをターゲットのバージョン(1.4など)に設定すると、1.4jvmでJava6でコンパイルされたコードを実行できます。これは、ターゲットバージョン以降に追加された追加のクラスまたは言語機能を使用していない場合に機能します。

幸運を。

于 2009-11-10T20:34:01.730 に答える
0

そうは思わない。

ときどき(説明するには複雑すぎる理由で)、1.6JDKでコンパイルした1.5JREでコードを実行しようとします。通常、java.lang.UnsupportedClassVersionError例外がスローされます。

于 2009-11-10T20:25:59.483 に答える
0

はい、1.6コンパイラ(javac)を使用して1.4と互換性のあるクラスファイルを作成できますが、これを実行するだけでは、必ずしも機能するコードが作成されるとは限りません。問題は、それでも1.6バージョンのAPIに対してコンパイルされることです。

一見、コントラクトは変更されるべきではないので、これが問題になるとは思わないでしょうが、問題がありました-IIRCを整数とする新しいコンストラクターがBigDecimal(1.5)に追加されたため、コンパイル時にそのコンストラクターへの呼び出しが指定されましたが、実行時にそのコンストラクターが存在しなかったため、実行時例外が発生しました。メソッドがオーバーロードされ、自動変数変換に依存している場合、おそらくこのような問題が発生するでしょう。

Javacアプリは、実際には、それが属するJavaのバージョンに依存しません。1.6javacに対して使用する別のAPIを指定できます。実行時の問題を回避するには、これを実行する必要があります。

于 2009-11-11T08:46:47.863 に答える
0

Java 1.5は、enums、autoboxing、その他のものを導入したメジャーリリースでした。コンパイル中に、サポートされていないクラスバージョンという例外が発生します。ただし、コマンドjavac -source 1.4 -target 1._ claasname.javaを使用してコンパイルすると、コンパイルされます。

そのシナリオで自動ボクシングや列挙型などの1.5の機能を使用している場合、これらの機能は1.4で使用できないため、コンパイルされません。この場合、いくつかのツールに基づいてコードを古いバージョンに変換する必要があります。

于 2019-08-27T14:08:27.330 に答える