ある JRE バージョン (1.6 など) を対象とするアプリケーションを作成したいとしますが、開発に使用するマシンには、新しいバージョンの JRE (1.7 など) がインストールされています。
素朴なアプローチは、コンパイラー・レベルを 1.6 に設定することです (私は Eclipse を使用していますが、問題は一般的なものであるため、おそらくそれほど重要ではありません)。しかし、それだけでは十分ではありません。コンパイラのソース レベルを設定すると、ソース ファイルはその Java バージョンで使用可能な言語機能のみを使用するようになり、生成されたクラス ファイルには適切なマイナー バージョンが含まれるため、ターゲット JVM はそれらを読み込んで実行できるようになります。
しかし、別のより微妙な問題があります。コードで 1.7 で追加されたクラスまたはメソッドを使用し、1.6 ランタイムがインストールされているマシンでアプリを実行しようとすると、 aNoClassDefFoundError
または aで失敗しますNoSuchMethodError
。
問題は、インストールされている 1.7 JDK にこれらのクラスが含まれているため、同じプログラムが dev マシンで正常に実行されることです。コンパイラまたは IDE も文句を言いません。使用できないクラスとメソッドを参照していることを示す唯一の指標はSince 1.7
、JavaDoc のコメントです。
では、古いバージョンの JRE では使用できないクラスやメソッドを使用しないようにするにはどうすればよいでしょうか? ビルドパスに正確なターゲット JRE バージョンを常に持つ唯一の信頼できるソリューションはありますか? これは、そのような場合 (1.7、1.6、場合によっては 1.5、場合によっては 1.4) ごとに、開発マシンに追加の JDK をインストールする必要があることを意味します。