160

sourceCompatibilityとの関係/違いは何targetCompatibilityですか? 異なる値に設定するとどうなりますか?

Gradleのドキュメントによると:

sourceCompatibilityは「Java ソースのコンパイル時に使用する Java バージョンの互換性」です。 targetCompatibilityは「クラスを生成する Java バージョン」です。

私の理解ではtargetCompatibility、Java の特定のバージョンと互換性のある Java バイトコードが生成されますが、これは の機能のサブセットsourceCompatibilityですか?

4

5 に答える 5

80

これらを使用するときは注意してください。私たちは仮定を立てる人々に噛まれてきました。

1.5 の sourceCompability (または targetCompatibility) を使用しているからといって、常に JDK 1.6 でコードをコンパイルして、JDK 1.5 で動作すると期待できるわけではありません。問題は利用可能なライブラリです。

JDK 1.6 でのみ使用可能なメソッドをコードが呼び出した場合でも、ターゲット VM のさまざまな互換性オプションでコンパイルされます。しかし、実行すると、問題のあるメソッドが存在しないため失敗します (MethodNotFoundException または ClassNotFoundException が発生します)。

このため、私は常に、Compatibility 設定を、ビルドしている実際の Java バージョンと比較します。それらが一致しない場合、ビルドに失敗します。

于 2014-03-11T13:22:28.970 に答える
40

sourceCompatibility = .javaファイルのコンパイルに使用する Java プログラミング言語のバージョンを指定します。例 sourceCompatibility 1.6 = Java プログラミング言語のバージョン 1.6 を使用して.javaファイルをコンパイルすることを指定します。

デフォルトでは、sourceCompatibility = 「現在使用中の JVM のバージョン」および targetCompatibility = sourceCompatibility

targetCompatibility = このオプションは、生成されたクラス ファイルが targetCompatibility で指定された VM と互換性があることを保証します。ほとんどの場合、-target オプションの値は -source オプションの値であることに注意してください。その場合、-target オプションを省略できます。

クラス ファイルは、targetCompatibility で指定されたターゲットとそれ以降のバージョンで実行されますが、以前のバージョンの VM では実行されません。

于 2015-04-08T15:33:38.623 に答える
0

私の意見では、「sourceCompatibility」とは、ソース コードで使用できる機能を意味します。たとえば、sourceCompatibility を 1.7 に設定すると、jdk バージョンが1.8。
「targetCompatibility」とは、生成されたクラスファイルが実行できるjreのバージョンを意味し、1.8に設定すると、jdk 1.7では正常に実行されない可能性がありますが、通常はそれ以上のバージョンのjdkで実行できます。

于 2020-04-07T12:24:11.563 に答える