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

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

Сценарий:

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

Что я хочу

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

Я думал о том, чтобы иметь 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).

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

23 ответа

Решение

Два пути

  1. В gradle.properties в .gradle каталог в вашем HOME_DIRECTORY задавать org.gradle.java.home=/path_to_jdk_directory

  2. В вашем build.gradle

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

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

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

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

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

В build.gradle вы можете добиться этого с

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

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

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

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

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

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

Если у вас есть эта проблема с Intellij, попробуйте следующие варианты

  1. Установить Gradle JVM на главную

  2. Установите версию JDK в настройках модуля Project

Если вы выполняете с использованием Gradle Wrap, вы можете запустить команду с путем JDK, как показано ниже

./gradlew -Dorg.gradle.java.home=/jdk_path_directory

Вы можете легко указать желаемую версию Java, указав на уровне проекта gradle.properties. Это повлияет на текущий проект, а не на изменение языкового уровня для каждого проекта во всей системе.

      org.gradle.java.home=<YOUR_JDK_PATH>

Если вы используете JDK 9+, вы можете сделать это:

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

tasks.withType<JavaCompile> {
    options.compilerArgs.addAll(arrayOf("--release", "8"))
}

Вы также можете увидеть следующие связанные проблемы:

Если вы используете linux и gradle wrapper, вы можете использовать следующее решение.

Добавьте путь к файлу local.properties:

javaHome=<path to JDK>

Добавьте к вашему файлу сценария gradlew:

DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
source $DIR/local.properties 2>/dev/null

if ! [ -z "$javaHome" ]
then
  JAVA_HOME=$javaHome
fi

В этом решении каждый разработчик может установить свой собственный путь JDK. файл local.properties не должны быть включены в систему контроля версий.

Есть еще один вариант для подражания. В ваших задачах вы можете установить желаемый путь JDK. (Я знаю, что это время, так как вопрос был опубликован. Этот ответ может кому-то помочь.)

Щелкните правой кнопкой мыши на развертывании или любой другой задаче и выберите "Открыть конфигурацию запуска Gradle..."

введите описание изображения здесь

Затем перейдите к "Java Home" и вставьте желаемый путь Java.

введите описание изображения здесь

Обратите внимание, что bin будет добавлен самой задачей gradle. Так что не добавляйте "мусорное ведро" к пути.

Для Windows запустите задачу gradle с параметром пути jdk 11 в кавычках

gradlew clean build -Dorg.gradle.java.home="c:/Program Files/Java/jdk-11"

Я добавил эту строку в мой файл GRADLE_HOME/bin/gradle - export JAVA_HOME=/path/to/java/version

      *gradle.properties
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
org.gradle.java.home=C\:\\Program Files\\Java\\jdk-11.0.15
-------------------------------------------------------------------
**build.gradle**
android {
    compileSdkVersion flutter.compileSdkVersion
    ndkVersion flutter.ndkVersion
    compileOptions {
        sourceCompatibility 11
        targetCompatibility 11
    }
    kotlinOptions {
        jvmTarget = '11'
        useIR = true
    }
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }*

после установки flutter3.0 и jdk11 эти шаги сработали для меня

Для Windows откройте cmd и войдите в корень вашего проекта, затем выполните такую ​​команду:

gradlew build -Dorg.gradle.java.home="jdk_path"

Мой JDK находится по этому пути: C:\Program Files\Java\jdk-11.0.5.

Итак, в моем случае это выглядит так:

gradlew build -Dorg.gradle.java.home="C:\Program Files\Java\jdk-11.0.5"

Кроме того, если вы хотите указать определенный вариант, вы можете сделать это так:

gradlew assemblyDebug -Dorg.gradle.java.home = "E: \ AndroidStudio \ jre"

Эта команда скомпилирует ваш проект с вариантом отладки и выведет 2 apks(отладка + выпуск) в 2 папки.

Есть довольно простой способ. Вы можете попробовать следующее решение.

      sudo update-alternatives --config java

После обновления версии Java проверьте текущую версию JVM в Gradle, чтобы убедиться, что это изменение было применено.

      gradle -v

Для получения более подробной информации просмотрите свой gradlew файл (в Unix-подобных ОС) или gradlew.bat файл (в ОС Windows), чтобы увидеть, как конфигурация Gradle JAVACMD Переменная.

Например

      # Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

Есть плагин Gradle, который автоматически загружает / загружает JDK:

https://plugins.gradle.org/plugin/com.github.rmee.jdk-bootstrap

Интеграция IDE еще не требуется, и для Windows требуется приличная оболочка.

Как видно в Gradle (Eclipse плагин)

http://www.gradle.org/get-started

Gradle использует тот JDK, который он найдет на вашем пути (для проверки используйте java -version). Кроме того, вы можете установить переменную среды JAVA_HOME, чтобы она указывала на каталог установки нужного JDK.


Если вы используете этот плагин Eclipse или Enide Studio 2014, альтернативный JAVA_HOME для использования (установленный в Предпочтениях) будет в версии 0.15, см. http://www.nodeclipse.org/history

Если вы просто хотите установить его один раз для запуска определенной команды:

JAVA_HOME=/usr/lib/jvm/java-11-oracle/ gw build

Итак, я использую IntelliJ для своего проекта Android, и следующее решение проблемы в IDE:

просто потому, что это может сэкономить кому-то несколько часов, которые я потратил... IntelliJ -> Настройки -> Сборка, выполнение, развертывание -> Инструменты сборки -> Maven -> Gradle

и установите Gradle JVM на 1.8, убедитесь, что у вас также установлен JDK 8...

ПРИМЕЧАНИЕ: проект отлично компилировался из командной строки.

Android Studio

Файл> Структура проекта> Расположение SDK> Расположение JDK>

/usr/lib/jvm/java-8-openjdk-amd64

GL

Установить JDK

Если вы используете Kotlin DSL, то в build.gradle.kts добавлять:

tasks.withType<JavaCompile> {
    options.isFork = true
    options.forkOptions.javaHome = File("C:\\bin\\jdk-13.0.1\\")
}

Конечно, я предполагаю, что у вас есть ОС Windows и javac компилятор находится в пути C:\bin\jdk-13.0.1\bin\javac. Для ОС Linux будет аналогично.

Я использую Gradle 4.2 . JDK по умолчанию - Java 9. В начале Java 9 Gradle 4.2 работал на JDK 8 правильно (не JDK 9).

Я установил JDK вручную, как это, в файле %GRADLE_HOME%\bin\gradle.bat:

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%..

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

@rem VyDN-start.
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_144\
@rem VyDN-end.

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%


@rem VyDN-start.
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_144\
@rem VyDN-end.


set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windows variants

if not "%OS%" == "Windows_NT" goto win9xME_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\lib\gradle-launcher-4.2.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.launcher.GradleMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega

Благодаря этому ответу я смог определить, что моя проблема заключалась в том, что Gradle выбрал неправильный JDK, даже если JAVA_HOME был установлен правильно.

Мой оригинальный комментарий:

Моя ОС — Linux, и мой JAVA_HOME указывает на правильный путь. Я даже использовал эту команду gradle build -Dorg.gradle.java.home=$JAVA_HOME, чтобы доказать свою точку зрения. Я установил gradle с помощью оснастки в Ubuntu, и я предполагаю, что он использует какой-то связанный JDK.

Мое решение:

Я удалил Gradle с помощью оснастки, а затем вручную установил Gradle, загрузив их двоичные файлы и поместив их в PATH.

Я пришел к выводу, что установка Gradle snap на Ubuntu идет в комплекте с некоторыми старыми JDK.

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