【问题标题】:how to set the use --enable-preview compile and run flags from gradle?如何设置使用 --enable-preview 从 gradle 编译和运行标志?
【发布时间】:2020-09-03 01:35:29
【问题描述】:

Lookinggradle 构建中使用来自 Java 14 的 records,但我得到了:

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$            

javac 编译看起来没问题:

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$ 

如何在以下构建文件中设置这些编译选项:

/*
 * 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 版本:

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$ 

【问题讨论】:

    标签: java gradle javac java-14 preview-feature


    【解决方案1】:

    要完成这项工作,您可以修改compileJava 任务并添加此标志。将此添加到您的 build.gradle

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

    这将确保您的代码能够编译。


    如果您有其他需要编译的任务(例如compileTestJava),您可以为所有类型为JavaCompile 的任务启用此标志:

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

    要为测试任务启用此标志,您可以执行以下操作:

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

    您还必须确保为将运行您的代码的 JVM 添加此标志:

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

    这在对应的JEP中有描述:

    希望在其程序中使用预览语言功能的开发人员必须在编译器和运行时系统中明确启用它们

    【讨论】:

    • 大声笑,是的,我只是给出了一个答案,但是我认为是的。我认为您必须添加“source 14”选项。
    • 我刚刚测试过,只要添加这个选项就可以了。
    【解决方案2】:

    将此添加到build.gradle 文件中:

    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" 
    }
    

    另外,运行选项是必需的:

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

    可能会修复,或者我认为至少在正确的轨道上。

    【讨论】:

    • 值得注意的是,并非所有这些行都是必需的。只有options.compilerArgs += ["--enable-preview"]-source 14 和运行选项是相关的。
    • 我不太明白source 14 标志;我认为甲骨文博客将其指定为必需的……但是是吗?我从 stackoverflow 上的另一个答案中复制了上述内容,但忘记引用了。
    • @Clashsoft 在 Intellij 中,当 build 被委托给 gradle 时,从 intellij 启动应用程序是爆炸式的,除非添加 tasks.withType(JavaExec) { jvmArgs += '--enable-preview' }。一定是IntelliJ IDEA 2020.2.1中的bug
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多