how to set the use --enable-preview compile and run flags from gradle?
Asked Answered
L

2

14

Looking to use records from Java 14 in a gradle build, but am getting:

thufir@dur:~/NetBeansProjects/FileWatcherHandler$ 
thufir@dur:~/NetBeansProjects/FileWatcherHandler$ gradle clean build

> Task :compileJava FAILED
/home/thufir/NetBeansProjects/FileWatcherHandler/src/main/java/net/bounceme/dur/files/FXOrder.java:3: error: records are a preview feature and are disabled by default.
public record FXOrder(int units) {}
       ^
  (use --enable-preview to enable records)
1 error

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed; see the compiler error output for details.

* 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 641ms
2 actionable tasks: 1 executed, 1 up-to-date
thufir@dur:~/NetBeansProjects/FileWatcherHandler$            

compiling with javac looks okay:

thufir@dur:~/java$ 
thufir@dur:~/java$ ls
FXOrder.java
thufir@dur:~/java$ 
thufir@dur:~/java$ cat FXOrder.java 

public record FXOrder(int units) {}
thufir@dur:~/java$ 
thufir@dur:~/java$ javac --enable-preview -source 14 FXOrder.java 
Note: FXOrder.java uses preview language features.
Note: Recompile with -Xlint:preview for details.
thufir@dur:~/java$ 
thufir@dur:~/java$ ls
FXOrder.class  FXOrder.java
thufir@dur:~/java$ 

how to set those compile options in the following build file:

/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java project to get you started.
 * For more details take a look at the Java Quickstart chapter in the Gradle
 * User Manual available at https://docs.gradle.org/6.4.1/userguide/tutorial_java_projects.html
 */

plugins {
    // Apply the java plugin to add support for Java
    id 'java'

    // Apply the application plugin to add support for building a CLI application.
    id 'application'
}

repositories {
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {
    // This dependency is used by the application.
    implementation 'com.google.guava:guava:28.2-jre'

    // Use TestNG framework, also requires calling test.useTestNG() below
    testImplementation 'org.testng:testng:7.1.1'
}

application {
    // Define the main class for the application.
//    mainClassName = 'FileWatcherHandler.App'
    mainClassName = 'net.bounceme.dur.files.App'


}

test {
    // Use TestNG for unit tests
    useTestNG()
}

java version:

thufir@dur:~/java$ 
thufir@dur:~/java$ gradle --version

------------------------------------------------------------
Gradle 6.4.1
------------------------------------------------------------

Build time:   2020-05-15 19:43:40 UTC
Revision:     1a04183c502614b5c80e33d603074e0b4a2777c5

Kotlin:       1.3.71
Groovy:       2.5.10
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          14.0.1 (AdoptOpenJDK 14.0.1+7)
OS:           Linux 5.4.0-29-generic amd64

thufir@dur:~/java$ 
thufir@dur:~/java$ java --version
openjdk 14.0.1 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.1+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.1+7, mixed mode, sharing)
thufir@dur:~/java$ 
thufir@dur:~/java$ javac --version
javac 14.0.1
thufir@dur:~/java$ 
thufir@dur:~/java$ which java
/home/thufir/.sdkman/candidates/java/current/bin/java
thufir@dur:~/java$ 
Leiker answered 17/5, 2020 at 9:20 Comment(0)
J
22

To make this work you can modify the compileJava task and add this flag. Add this to your build.gradle :

compileJava {
    options.compilerArgs += ['--enable-preview']
}

This will make sure that your code will compile.


If you have other tasks which require compilation (for example compileTestJava) you can enable this flag for all tasks which have type JavaCompile :

tasks.withType(JavaCompile).all {
    options.compilerArgs += ['--enable-preview']
}

To enable this flag for test tasks you can do the following :

tasks.withType(Test).all {
    jvmArgs += '--enable-preview'
}

You also have to make sure to add this flag for the JVM that will run your code :

tasks.withType(JavaExec) {
    jvmArgs += '--enable-preview'
}

This is described in the corresponding JEP :

Developers who wish to use preview language features in their programs must explicitly enable them in the compiler and the runtime system

Joesphjoete answered 17/5, 2020 at 9:41 Comment(1)
lol, yes, I just put an answer, but yes I think so. I think you have to add the "source 14" option.Leiker
L
2

adding this to the build.gradle file:

compileJava {
    options.warnings = false
    options.deprecation = false
    options.compilerArgs += ["-Xdoclint:none", "-Xlint:none", "-nowarn"]
    options.compilerArgs += ["-Xlint"]
    options.compilerArgs += ["--enable-preview"]
    options.compilerArgs += ["-source 14"]
    // options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" 
}

also, the run option is required:

tasks.withType(JavaExec) { jvmArgs += '--enable-preview' }

might fix, or is at least on the right track I think.

Leiker answered 17/5, 2020 at 9:41 Comment(3)
Worth noting that not all of these lines are necessary. Only options.compilerArgs += ["--enable-preview"], -source 14 and the run option are relevant.Durwood
I don't quite understand the source 14 flag; the oracle blog specifies it as, I think, required...but is it? I copied the above from another answer on stackoverflow but forgot to cite it.Leiker
@Durwood Within Intellij, when build is delegated to gradle, the launch of application from intellij is bombing unless this is added tasks.withType(JavaExec) { jvmArgs += '--enable-preview' }. Must be a bug in IntelliJ IDEA 2020.2.1Blowtorch

© 2022 - 2024 — McMap. All rights reserved.