Gradle、「sourceCompatibility」対「targetCompatibility」?


130

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

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

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

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

回答:


80

targetCompatibilitysourceCompatibilityにマップ-target release-source releaseのjavacで。ソースは基本的にソース言語レベルであり、ターゲットは生成されるバイトコードのレベルです。

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


1
上記のリンクは、Java 7のドキュメントを指しています。docs.oracle.com/ en / java / javase / 11 / tools /…のようなものが必要なのでしょうか。
Brian Agnew

63

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

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

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

このような理由から、私はいつも、私は下の建物だ実際のJavaバージョンへの互換性の設定を比較します。それらが一致しない場合、ビルドは失敗します。


4
これは微妙ですが、非常に重要な観察です。
Natix

それらをどのように比較しますか?
zero01alpha

なぜビルドに失敗するのですか?「ブートストラップクラスパス」オプションは、この問題を軽減するためにのみ提供されています。いつでも適切なブートストラップを使用でき、問題なく動作するはずです。
Codebender 2016年

6
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())これは、build.gradleファイルの冒頭で、この問題を解決する方法です。
Xerus

2
Java 9以降、指定されたJavaバージョンで使用可能なAPIの使用のみを許可することにより、この問題に対処javacする--releaseことを目的とした新しいオプションがあります。詳細については、stackoverflow.com
James Muddを

35

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

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

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

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


私たちのプロジェクトが使用しているものをどのように見分けるのですか?
isJulian00

0

私の意見では、「sourceCompatibility」とは、ソースコードで使用できる機能を意味します。たとえば、sourceCompatibilityを1.7に設定すると、jdkバージョンであっても、Java 8の新機能であるラムダ式を使用できません1.8。
「targetCompatibility」については、生成されたクラスファイルを実行できるjreのバージョンを意味します。1.8に設定すると、jdk 1.7では正常に実行されない可能性がありますが、通常はより高いバージョンのjdkでは実行できます。


0

これらは、javacコマンドのフラグです。

javac [options] [sourcefiles]

Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...

つまり、sourceバージョンでコードを記述し、クラスをコンパイルしてtarget VMバージョンに。それを実行するために、例えば、古いJavaバージョンを備えた他のワークステーションで。

によると:https : //docs.oracle.com/en/java/javase/11/tools/javac.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.