4

ある 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 をインストールする必要があることを意味します。

4

1 に答える 1

3

コンパイル中にbootcpasspath1.6 JRE (具体的には ) を指すオプションを使用します。rt.jarそうすることで、参照されているすべてのクラス、メソッド、および属性が、提供された .xml に実際に存在することを強制的に確認できますrt.jar

詳細については、javac - クロスコンパイル オプションを参照してください。

于 2012-09-22T01:31:31.223 に答える