web-dev-qa-db-ja.com

Javaコンパイラバージョンをgradleで強制する方法は?

すべてのプロジェクトで、gradleを使用して、以下を指定します。

sourceCompatibility = "1.7"; // for example
targetCompatibility = "1.7"; // defaults to sourceCompatibility

これで、1.6から1.8までの3つの異なるバージョンのJDKがインストールされました。あるバージョンから別のバージョンに切り替えるために、私はsourceシェルファイルをPATHJava_HOME、さらにはJDK_HOMEに変更します。

誤って間違ったJDKバージョンを使用しているのに、それを望まない場合があります...コンパイルタスクを試行する前に、コンパイラのバージョンがtargetCompatibilityと等しいことを確認する可能性はありますか?

18
fge

私は以下を使用します:

task checkJavaVersion << {
    if (!JavaVersion.current().isJava6()) {
        String message = "ERROR: Java 1.6 required but " +
                          JavaVersion.current() +
                          " found. Change your Java_HOME environment variable.";
        throw new IllegalStateException(message);
    }
}

compileJava.dependsOn checkJavaVersion
15
JB Nizet

自己への回答、そして最初の解決策を提供してくれた @ JBNizet に感謝します...

解決策は確かに JavaVersion を使用することであり、sourceCompatibilitytargetCompatibilityの両方が引数としてJavaVersionを受け入れることが起こります。 ..

したがって、ビルドファイルは次のようになります。

def javaVersion = JavaVersion.VERSION_1_7;
sourceCompatibility = javaVersion;
targetCompatibility = javaVersion; // defaults to sourceCompatibility

そして、タスク:

task enforceVersion << {
    def foundVersion = JavaVersion.current();
    if (foundVersion != javaVersion) 
        throw new IllegalStateException("Wrong Java version; required is "
            + javaVersion + ", but found " + foundVersion);
}

compileJava.dependsOn(enforceVersion);

そしてそれは機能します:

$ ./gradlew clean compileJava
:clean UP-TO-DATE
:enforceVersion FAILED

FAILURE: Build failed with an exception.

* Where:
Build file '/home/fge/src/perso/grappa-tracer-backport/build.gradle' line: 55

* What went wrong:
Execution failed for task ':enforceVersion'.
> Wrong Java version; required is 1.7, but found 1.8
18
fge

すべてのタスクについてバージョンをチェックする場合は、build.gradleにアサーションを追加して強制できます。

assert JavaVersion.current().isJava9Compatible(): "Java 9 or newer is required"

Gradle 5.4.1では、失敗は次のようになります。

$ ./gradlew --quiet build
FAILURE: Build failed with an exception.

* Where:
Build file '/home/codehearts/build.gradle' line: 15

* What went wrong:
A problem occurred evaluating root project 'Codehearts'.
> Java 9 or newer is required. Expression: org.gradle.api.JavaVersion.current().isJava9Compatible()

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 3s

必要に応じて、正確なバージョンを確認することもできます。

assert JavaVersion.current().isJava9(): "Java 9 is required"
1
codehearts