9

Java 1.5 でコーディングされた Java プロジェクトがあり、新しいバージョンの Java を使用しているが、ターゲットを 1.5 に設定しているとします。

コードが新しい Java でコンパイルおよびテストされた場合、実際の Java 1.5 ランタイムで同じように動作することが保証されますか?

それとも、確実に依存しているすべての JRE の 1 つのバージョンをインストールする必要がありますか?

JRE のバグはどうなりますか? 1.5 にバグがある場合は、1.6 で修正されています。ターゲットを 1.5 に設定して Java 1.6 を使用した場合、そのバグは影響しますか?

現実的なシナリオでは、これは私が持つ必要がある懸念事項ですか?

4

3 に答える 3

9

ターゲットとソースを1.5に設定したとすると、私が考えることができる3つの主要なケースでのみ心配する必要があります。

  • 内部com.sunクラスを使用していますが、これは変更または消失した可能性があります(または、他の内部動作に何らかの形で依存しています)。

  • 後のバージョンで修正されたバグのある動作に依存しています。

  • 後方互換性のない変更に遭遇します(まれですが、発生することが知られています)。

    JREのバグはどうなりますか?1.5にバグがある場合、それは1.6で修正されます。ターゲットを1.5に設定してJava1.6を使用した場合、そのバグは影響しますか?

バグがライブラリにある場合は、影響はありません。Targetは、コンパイルするバイトコードのバージョンを実際に規定するだけであり、更新されたライブラリを引き続き使用します。ただし、前述のように、このバグのある動作に依存している場合は、問題が発生する可能性があることに注意してください。

意図的に後方互換性のない変更があった場合、これについて私が見たすべてのケースは、実行時エラーではなくコンパイル時エラーとして現れるため、簡単に見つけることができます(通常は修正も非常に簡単です)。

リリースする前に、新しいバージョンのJVMでのテストを引き続き推奨しますが、実際には、とにかく私の経験では、通常は問題になりません。

于 2013-03-05T16:45:01.893 に答える
5

すべての新しいJRE実装は互換性を維持する方法で作成されているため、答えは「はい」です。ただし、プロジェクトに固有の問題がある可能性があるため、アプリをテストすることをお勧めします。

于 2013-03-05T16:45:03.913 に答える
2

あなたの質問を要約すると: JRE は後方互換性がありますか? JDK は前方互換性がありますか?

短い答えはイエスです。

説明: JDK には下位互換性がありません。つまり、JDK5 コードは JVM4 で実行できず、JDK6 は JVM5 で実行できません。

ただし、JRE は下位互換性が確保されています。これは、多くの場合、組織は一度書き、何度も実行するためです。

理由: よりインテリジェントなヒープ管理、ガベージ コレクション、スレッド処理などにより、JRE がますます洗練されるにつれて、顧客は新しいバージョンの JVM に移行したくなる傾向にあります。

バグ
JVM に存在する実際のバグは、新しいバージョンの JVM を以前の「ターゲット」で使用すると、そのように動作しなくなります。これは、target=prev_version以前の JVM を完全には呼び出さないためです。デルタ
のみを取得し、コードを別の方法で扱います。ただし、それが新しい JVM (たとえば 6) で意図的に導入された機能である場合、target=1.5 に切り替えると、実際には 1.5 の beahvior にフォールバックします。

あなたの疑問がある程度明確になることを願っています。

于 2013-03-05T16:55:50.297 に答える