Как сказать 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 ответа
Два пути
В
gradle.properties
в.gradle
каталог в вашемHOME_DIRECTORY
задаватьorg.gradle.java.home=/path_to_jdk_directory
В вашем
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, попробуйте следующие варианты
Если вы выполняете с использованием 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"))
}
Вы также можете увидеть следующие связанные проблемы:
- Gradle: [Java 9] Добавьте удобный метод для
-release
аргумент компилятора - Подключаемые модули Eclipse для Gradle: совместимость API JDK должна соответствовать параметру sourceCompatibility.
Если вы используете 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
Если вы используете 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.