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


285

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

Сценарий:

  • У меня есть приложение, созданное с помощью 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).

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


6
Вы пробовали установку org.gradle.java.homeв gradle.propertiesфайле? ссылка
Рэй Стожоник

в eclipse вы можете создать «файл конфигурации продукта» в вашем проекте и упаковать jdk вместе с вашим продуктом. Нет необходимости указывать переменные env.
Мданачи

3
@RayStojonic: Я только что попробовал, но Gradle все еще использует JDK JAVA_HOME для сборки :(
хулиган

@mdanaci: Я действительно надеялся, что смогу избежать этого, потому что, честно говоря, я не хочу брать JDK под контроль версий (что будет следствием, если я воспользуюсь вашим предложением), поскольку любой разработчик должен иметь возможность упаковать приложение. Плюс, я вижу проблемы с CI сервером таким образом. В любом случае, спасибо за ваше предложение :)
хулиган

3
По состоянию на год назад, org.gradle.java.homeнастройка применима только к демону gradle, по-видимому ... В любом случае, попробуйте установить fork в true и forkOptions.executable для jdk, который вы хотите использовать: link
Ray Stojonic

Ответы:


292

Два пути

  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
    

23
Это gradle.propertiesможно определить и на уровне проекта, см. Gradle.org/docs/current/userguide/build_environment.html
Паоло Фулгони,

144
Если вы выполняете с использованием Gradle-оболочки, вы также можете сделать это следующим образом ./gradlew -Dorg.gradle.java.home=/path_to_jdk_directory. Хорошо, если ты не хочешь трогать gradle.properties.
david.schreiber

26
Вопрос был в том, как установить VERSION, а не JDK PATH, не так ли?
Дим

40
Таким образом, я не могу поделиться проектом с другими разработчиками, которые имеют Java по разным путям.
Димс

10
Существует различие между вариантами 1 и 2, которое следует уточнить: в варианте 1 мы устанавливаем JVM для запуска самого gradle, в которой также будет использоваться для запуска задачи компилятора (обратите внимание, что сам javac является приложением java), в то время как в Вариант 2: мы просто устанавливаем javac, который будет порождаться в его собственной JVM. Если по какой-либо причине нам нужна определенная JVM для gradle (например, данный подключаемый модуль gradle компилируется, скажем, для Java 8), то мы были бы вынуждены прибегнуть к созданию отдельной JVM для процесса компиляции.
Базель Шишани

147

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

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

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


3
В Eclipse (Neon, 4.6) вы также можете установить Java Home в конфигурации сборки Gradle (см. Вкладку «Java Home»). Это довольно утомительная работа, если у вас более 20 заданий на сборку ... Я думаю, что Gradle действительно нужно выбрать каталог Java Home из конфигурации системы!
Маркус Л

1
Это справедливо. У меня есть софт-ссылка, /usr/lib/java/jdk/homeкоторая указывает на текущую установленную версию. Конечно, когда вам нужна конкретная версия (например, u51), вам нужно быть конкретным в отношении пути. Кроме того, некоторые инструменты хотят, чтобы запуск gradle, похоже, не устанавливает JDK в среде, которую они дают gradle. И я никогда не устанавливал JDK в качестве текущего JAVA_HOME, если это не сеанс разработки.
будет

6
Обратите внимание, что JDK_PATH не может иметь пробелов в Windows, даже если он в кавычках: вы изменили «Program Files» на PROGRA~1(все заглавные буквы) или что-то еще, что DIR / X говорит вам.
Ноумен

2
Если вы используете упаковщик gradle, вызовите команду, подобную этой ./gradlew build -Dorg.gradle.java.home = / JDK_PATH Замените JDK_PATH на ваше местоположение jdk в вашей среде, например '/opt/java/jdk1.7.0_79/bin/'
mirmdasif

3
"... gradle itself (either standalone distribution or wrapper) uses JDK from JAVA_HOME environment variable or (if it is not set) from PATH".Я указал JAVA_HOME до вызова gradlew, чтобы это исправить. (т.е. env JAVA_HOME=/path/to/java gradlew war --stacktrace)
TekiusFanatikus

111

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

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

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

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


1
Это сработало для меня, но мне пришлось поменять «применить плагин« java »» на «применить плагин:« java »» (обратите внимание на двоеточие)
will.fiset

10
@morgwai - за исключением того, что это не ответ на вопрос, который явно задает вопрос «Что я хочу [это установить] переменную (определенную для машины разработчика), которая указывает на установку JDK, который будет использоваться для сборки все приложение ". Полученные ответы верны; Этот ответ на совершенно другой вопрос.
Жюль

1
Это игнорируется такими инструментами, как задача Javadoc (которая пытается сгенерировать Javadoc в соответствии с Java 9 с модулями в моем проекте, которые определены для использования Java 8)
CLOVIS

20

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

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


5

Если вы используете 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не должен быть включен в систему контроля версий.


5

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


4

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

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

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

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

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

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


Не вижу заданий на подделку
Пол Маккарти


1

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

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

0

Как видно в 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


1
Привет Пол, на самом деле, именно это моя проблема. Я хочу определить другой JDK для задач построения gradle, чем определенный в JAVA_HOME. Хотя, хорошо знать, что для этого в плагине eclipse будет запись :)
хулиган

Стандартный Eclipse позволяет определять переменные среды для каждой конфигурации запуска. Но это не то, что мы пытаемся с Gradle. Откройте вопрос, если вы исследуете этот вопрос далее github.com/Nodeclipse/nodeclipse-1/issues
Пол Верест

0

Я использую 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

0

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

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

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

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



0

Если вы используете 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 будет аналогично.


-1

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

JAVA_HOME=/usr/lib/jvm/java-11-oracle/ gw build
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.