1. 概要

この記事では、sourceCompatbilityとtargetCompatibilityJavaの構成の違いと、Gradleでの使用法について説明します。

基本について詳しくは、Gradleの概要の記事をご覧ください。

2. Javaでのバージョンの処理

javac を使用してJavaプログラムをコンパイルする場合、バージョン処理用のコンパイルオプションを提供できます。 利用可能な2つのオプションがあります。

  • -Javaバージョンと一致する値を持つソースコンパイルに使用しているJDK まで(たとえば、JDK8の場合は1.8)。 私たちが提供するバージョン値は、ソースコードで使用できる言語機能をそれぞれのJavaバージョンに制限します。
  • -target も同様ですが、生成されるクラスファイルのバージョンを制御します。 これは、提供するバージョン値がプログラムが実行できる最も低いJavaバージョンになることを意味します。

例えば:

javac HelloWorld.java -source 1.6 -target 1.8

これにより、を実行するためにJava8以降が必要なクラスファイルが生成されます。 さらに、ソースコードには、ラムダ式やJava6で使用できない機能を含めることはできません。

3. Gradleでバージョンを処理する

Gradleは、Javaプラグインとともに、sourceCompatibilityおよびtargetCompatibility構成を使用して、sourceおよびtargetオプションを設定できます。 ]javaタスク。 同様に、javac。と同じ値を使用します

build.gradleファイルを設定しましょう。

plugins {
    id 'java'
}

group 'com.baeldung'

java {
    sourceCompatibility = "1.6"
    targetCompatibility = "1.8"
}

4. HelloWorldAppコンパイル例

Hello Worldを作成できます! コンソールアプリを作成し、上記のスクリプトを使用してビルドして機能をデモンストレーションします。

非常に単純なクラスを作成しましょう。

public class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

gradle build コマンドを使用してビルドすると、GradleはHelloWorldApp.classという名前のクラスファイルを生成します。

Javaにパッケージ化されているjavapコマンドラインツールを使用して、このクラスファイルの生成されたバイトコードバージョンを確認できます。

javap -verbose HelloWorldApp.class

これは多くの情報を出力しますが、最初の数行で次のことがわかります。

public class com.baeldung.helloworld.HelloWorldApp
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER

major version フィールドの値は52で、これはJava8クラスファイルのバージョン番号です。 これは、 HelloWorldApp.classがJava8以降を使用してのみ実行できることを意味します。

sourceCompatibility 構成をテストするために、ソースコードを変更して、Java6では使用できない機能を導入できます。

ラムダ式を使用してみましょう:

public class HelloWorldApp {

    public static void main(String[] args) {
        Runnable helloLambda = () -> {
            System.out.println("Hello World!");
        }
        helloLambda.run();
    }

}

Gradleを使用してコードをビルドしようとすると、コンパイルエラーが発生します。

error: lambda expressions are not supported in -source 1.6

-source オプションは、Javaで sourceCompatibility Gradle構成に相当し、コードがコンパイルされないようにします。 基本的に、は、上位バージョンの機能を誤って使用しないように保護します。たとえば、アプリをJava6ランタイムでも実行できるようにしたい場合があります。

5. 結論

この記事では、-sourceおよび-targetコンパイルオプションを使用して、Javaソースコードのバージョンとターゲットランタイムを処理する方法について説明しました。 さらに、これらのオプションがJavaプラグインを使用してGradleのsourceCompatbilityおよびtargetCompatibility構成にどのようにマッピングされるかを学び、実際にそれらの機能を示しました。

いつものように、この記事のソースコードはGitHubから入手できます。