Вопрос-ответ

How do I tell Gradle to use specific JDK version?

Как мне указать Gradle использовать определенную версию JDK?

Я не могу понять, как заставить это работать.

Сценарий:


  • У меня есть приложение, созданное с помощью gradle

  • Приложение использует JavaFX

Чего я хочу


  • Используйте переменную (определенную для каждой машины разработчика), которая указывает на установку JDK, которая будет использоваться для сборки всего приложения / тестов /...

Я думал о том, чтобы иметь gradle.properties файл, определяющий переменную. Что-то вроде

JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>

Чего я не хочу


  • укажите JAVA_HOME на желаемый JDK

Я мог бы смириться со многими предложениями:


  • решение, определяющее системную переменную окружения, которую я могу проверить в своем скрипте build.gradle

  • переменная, определенная в gradle.properties

  • переопределение переменной JAVA_HOME только для контекста сборки (что-то вроде use JAVA_HOME=<my special JDK path defined somewhere else defined>)

  • кое-что еще, о чем я не подумал

Вопрос:


  • Как подключить переменную (как бы она ни была определена, как переменная в gradle.properties, системная переменная окружения, ...) к процессу сборки?

У меня доступно более одного JDK7, и мне нужно указать специальную версию (минимальную версию JDK_u).

Приветствуется любой ответ, и я благодарен за каждый намек в правильном направлении.

Переведено автоматически
Ответ 1

Два способа


  1. В gradle.properties в .gradle каталоге в вашем HOME_DIRECTORY наборе org.gradle.java.home=/path_to_jdk_directory

или:


  1. В вашем build.gradle


     compileJava.options.fork = true
    compileJava.options.forkOptions.executable = '/path_to_javac'


Ответ 2

Если вы добавите JDK_PATH в gradle.properties, ваша сборка станет зависимой от этого конкретного пути. Вместо этого запустите gradle task со следующим параметром командной строки

gradle build -Dorg.gradle.java.home=/JDK_PATH

Таким образом, ваша сборка не зависит от какого-то конкретного пути.

Ответ 3

Для людей, попадающих сюда при поиске Gradle-эквивалента свойства Maven maven.compiler.source (или <source>1.8</source>):

В build.gradle вы можете достичь этого с помощью

apply plugin: 'java'
sourceCompatibility = 1.8
targetCompatibility = 1.8

Смотрите документацию Gradle по этому вопросу.

Gradle 7+

Начиная с Gradle 7, вы также можете использовать release свойство, которое использует --release аргумент компилятора JDK 9:

tasks.withType(JavaCompile) {
options.release = 8
}

(спасибо Педро Ламарану)

Ответ 4

Gradle 6.7+ — Используйте поддержку набора инструментов Gradle

Правильный способ сделать это с современными версиями Gradle (версия 6.7+) - использовать поддержку .

Следующий блок, когда плагин java будет применен к текущему проекту, будет использовать Java 11 во всех задачах компиляции Java, тестирования и javadoc:

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(11))
}
}

Это также можно настроить для отдельных задач.

ПРИМЕЧАНИЕ: Для других задач, зависящих от исполняемого файла Java или Java home, используйте метаданные компилятора для установки соответствующих параметров. Смотрите ниже пример с плагином Kotlin до версии 1.5.30.

Gradle пытается автоматически определять местоположение указанного JDK с помощью нескольких распространенных механизмов. Можно настроитьпользовательские местоположения, если автоматического определения недостаточно.

Kotlin 1.7.20+

Для Kotlin 1.7.20+ плагин Kotlin напрямую поддерживает цепочки инструментов и имеет упрощенный синтаксис:

kotlin {
jvmToolchain(17)
}

Kotlin 1.5.30+

Для Kotlin 1.5.30+ плагин Kotlin напрямую поддерживает цепочки инструментов:

kotlin {
jvmToolchain {
(this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(17))
}
}

Более ранние версии Kotlin

Настройка компилятора Kotlin для версий до 1.5.30 включает использование toolchain API для определения компилятора и передачу этой информации плагину. Другие плагины на основе компилятора могут быть настроены аналогичным образом.

val compiler = javaToolchains.compilerFor {
languageVersion.set(JavaLanguageVersion.of(11))
}

tasks.withType<KotlinJvmCompile>().configureEach {
kotlinOptions.jdkHome = compiler.get().metadata.installationPath.asFile.absolutePath
}
java