1

例如,我可以有一个 JavaExec 任务:

task javaExecCaseA(type: JavaExec) {
    javaLauncher = javaToolchains.launcherFor {
        languageVersion = JavaLanguageVersion.of(11)
    }
    classpath = files("MySimpleProgram.jar")
}

或者,在通用任务中:

task javaExecCaseB {
    doLast {
        javaexec {
            classpath = files("MySimpleProgram.jar")
        }
    }
}

我还没有弄清楚如何在第二种情况下(javaExecCaseB)指定JavaLanguageVersion。更大的问题是,有什么区别?

我尝试了各种方法在 javaExecCaseB 中设置版本,但最终出现如下错误:

Could not set unknown property 'javaLauncher' for object of type org.gradle.process.internal.DefaultJavaExecAction_Decorated
4

1 回答 1

0

我发现该任务是 gradle “JavaExec” 任务。第二种情况,javaexec 是一个 Project 方法。

我开始寻求一种方法来使用与 gradle 本身不同的 JVM 运行 Java 程序(在运行 gradle 时从环境变量或命令行设置)。

在这两种情况下,我都能让它工作:

ext {
    MyJvmVersion = 11
}

task SampleJavaExec1(type: JavaExec) {
    // Example task for using a custom JVM version with a JavaExec task
    javaLauncher = javaToolchains.launcherFor {
        languageVersion = JavaLanguageVersion.of(MyJvmVersion as int)
    }
    environment['JAVA_HOME'] = javaLauncher.get().metadata.installationPath.asFile.absolutePath
    classpath = files("MySimpleProgram.jar")
}

task SampleJavaExec2 {
    // Example task for using a custom JVM version with the javaexec method
    doLast {
        javaexec {
            environment['JAVA_HOME'] = "C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.10.9-hotspot"
            executable = "C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.10.9-hotspot\\bin\\java.exe"
            classpath = files("MySimpleProgram.jar")
        }
    }
}

在第二种情况下,javaexec() 似乎没有“javaLauncher”。除了硬编码路径,我还发现我可以使用 javaLauncher 通过在 javaexec{} 块中添加以下代码来为我找到它:

javaLauncher = javaToolchains.launcherFor {
    languageVersion = JavaLanguageVersion.of(MyJvmVersion as int)
}
environment['JAVA_HOME'] = javaLauncher.get().metadata.installationPath.asFile.absolutePath

也应该调用自动下载 JVM 解析,但我还没有测试那部分。

于 2021-03-10T19:00:10.603 回答