В gradle, в чем разница между javaexec и задачей JavaExec?

Например, у меня может быть задача JavaExec:

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

или внутри общей задачи:

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

Я не понял, как указать JavaLanguageVersion во втором случае (javaExecCaseB). Однако главный вопрос в том, в чем разница?

Я пробовал разные способы установить версию в javaExecCaseB, но в итоге получаю ошибку, например:

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

1 ответ

Я обнаружил, что задача - это задача gradle "JavaExec". И второй случай, javaexec - это метод проекта.

Я начал этот квест, чтобы найти способ запуска Java-программ с использованием JVM, отличной от используемой самой gradle (устанавливается из переменной среды или командной строки при запуске 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 с автоматической загрузкой, но я не тестировал эту часть.

Другие вопросы по тегам