¿Cómo le digo a Gradle que use una versión JDK específica?

284

No puedo entender que esto funcione.

Guión:

  • Tengo una aplicación construida con gradle
  • La aplicación usa JavaFX

Lo que quiero

  • Utilice una variable (definida por máquina de desarrollador) que apunte a la instalación de un JDK que se utilizará para construir toda la aplicación / pruebas / ...

Pensé en tener el gradle.propertiesarchivo, definiendo la variable. Algo como

JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>

Lo que no quiero

  • apunte JAVA_HOMEal JDK deseado

Podría vivir con muchas sugerencias:

  • una solución que define una variable de entorno del sistema que puedo verificar en mi script build.gradle
  • una variable definida en gradle.properties
  • anulando la variable JAVA_HOME solo para el contexto de compilación (algo así como use JAVA_HOME=<my special JDK path defined somewhere else defined>)
  • algo más en lo que no pensé

Pregunta:

  • ¿Cómo conectar una variable (como se haya definido, como variable en la gradle.propertiesvariable de entorno del sistema, ...) al proceso de construcción?

Tengo más de un JDK7 disponible y necesito apuntar a una versión especial (versión mínima de JDK_u).

Cualquier respuesta es apreciada y estoy agradecido por cada pista en la dirección correcta.

matón
fuente
66
¿Has intentado configurar org.gradle.java.homeen el gradle.propertiesarchivo? enlace
Ray Stojonic
en eclipse puede crear un "archivo de configuración del producto" en su proyecto y puede empaquetar el jdk con su producto. No es necesario especificar variables env.
mdanaci
3
@RayStojonic: acabo de intentarlo, pero Gradle todavía usa el JAVA_HOME JDK para construir :(
bully
@mdanaci: Realmente esperaba poder evitar esto porque, sinceramente, no quiero tomar un JDK bajo control de versiones (lo que sería la consecuencia si utilizara su sugerencia) ya que cualquier desarrollador tiene que poder empacar la aplicación. Además, veo problemas con el servidor CI de esta manera. Gracias por su sugerencia de todos modos :)
matón
3
A partir de hace un año, la org.gradle.java.homeconfiguración se aplica solo al gradle daemon, aparentemente ... En cualquier caso, intente configurar fork en true y forkOptions.executable al jdk que desea usar: enlace
Ray Stojonic

Respuestas:

292

Dos caminos

  1. En gradle.propertiesel .gradledirectorio en su HOME_DIRECTORYconjuntoorg.gradle.java.home=/path_to_jdk_directory

o:

  1. En tus build.gradle

    compileJava.options.fork = true
    compileJava.options.forkOptions.executable = /path_to_javac
Primer cero
fuente
23
También gradle.propertiesse puede definir a nivel de proyecto, consulte gradle.org/docs/current/userguide/build_environment.html
Paolo Fulgoni
143
Si está ejecutando usando gradle wrapper, también puede hacerlo ./gradlew -Dorg.gradle.java.home=/path_to_jdk_directory. Bien si no quieres tocar gradle.properties.
david.schreiber
26
La pregunta era cómo configurar VERSIÓN, no JDK PATH, ¿no?
Dims
39
De esta manera no puedo compartir proyectos con otros desarrolladores, que tienen Java en diferentes caminos.
Dims
10
Hay una diferencia entre las opciones 1 y 2 que debe aclararse: en la opción 1 estamos configurando la JVM para que se ejecute Gradle, que también se utilizará para ejecutar la tarea del compilador (tenga en cuenta que javac en sí es una aplicación java), mientras que en opción 2 solo estamos configurando javac para que se genere en su propia JVM. Si por alguna razón necesitamos una JVM específica para gradle (por ejemplo, se compila un complemento de gradle dado para, por ejemplo, Java 8), entonces nos veríamos obligados a recurrir a bifurcar una JVM separada para el proceso de compilación.
Basel Shishani
147

Si agrega JDK_PATH en gradle.properties, su compilación dependerá de esa ruta en particular. En su lugar, ejecute la tarea gradle con el siguiente parámetro de línea de comando

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

De esta manera, su construcción no depende de una ruta concreta.

mirmdasif
fuente
3
En Eclipse (Neon, 4.6) también puede establecer Java Home dentro de la configuración de compilación de Gradle (consulte la pestaña "Java Home"). Este es un trabajo algo tedioso si tiene más de 20 trabajos de construcción ... ¡Creo que Gradle realmente necesita elegir el directorio de inicio de Java de la configuración del sistema!
Markus L
1
Este es un punto justo. Tengo un enlace suave llamado /usr/lib/java/jdk/homeque apunta a la versión actual instalada. Por supuesto, cuando desea una versión específica (por ejemplo, u51), debe ser específico sobre la ruta. Además, algunas herramientas que quieren poner en marcha el gradle no parecen establecer el JDK en el entorno que le dan al gradle. Y por mi parte, nunca configuré el JDK como el JAVA_HOME actual a menos que sea una sesión de desarrollo.
será el
66
Tenga en cuenta que JDK_PATH no puede tener espacios en Windows, incluso si está entre comillas: debe cambiar "Archivos de programa" a PROGRA~1(todas mayúsculas) o cualquier otra cosa que DIR / X le indique.
Noumenon el
2
Si está utilizando gradle wrapper, invoque el comando como este ./gradlew build -Dorg.gradle.java.home = / JDK_PATH Reemplace JDK_PATH con su ubicación jdk en su entorno como '/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".Especifiqué el JAVA_HOME antes de la llamada gradlew para arreglar esto. (es decir env JAVA_HOME=/path/to/java gradlew war --stacktrace)
TekiusFanatikus
110

Para las personas que terminan aquí cuando buscan el equivalente de Gradle de la propiedad Maven maven.compiler.source(o <source>1.8</source>):

En build.gradle puedes lograr esto con

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

Vea la documentación de Gradle sobre esto .

Geert
fuente
1
Esto funcionó para mí, pero tuve que cambiar "aplicar el complemento 'java'" a "aplicar el complemento: 'java'" (observe los dos puntos)
will.fiset
9
@morgwai, excepto que esta no es la respuesta a la pregunta, que pregunta explícitamente "Lo que quiero [es establecer] una variable (definida por máquina de desarrollador) que apunta a una instalación de un JDK que se usará para construir toda la aplicación ". Las respuestas votadas son correctas; Esta respuesta es para una pregunta completamente diferente.
Jules
Esto es ignorado por herramientas como la tarea Javadoc (que intenta generar el javadoc de acuerdo con Java 9 con módulos en mi proyecto que se especifica para usar Java 8)
CLOVIS
20

Si está ejecutando usando gradle wrapper, puede ejecutar el comando con la ruta JDK como la siguiente

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

Vittal Pai
fuente
5

Si está utilizando linux y gradle wrapper, puede usar la siguiente solución.

Agregar ruta al archivo local.properties:

javaHome=<path to JDK>

Agregue a su archivo de script gradlew:

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

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

En esta solución, cada desarrollador puede establecer su propia ruta JDK. El archivo local.propertiesno debe incluirse en el sistema de control de versiones.

sylwano
fuente
5

Agregué esta línea en mi archivo GRADLE_HOME / bin / gradle - export JAVA_HOME=/path/to/java/version

Manoj
fuente
4

Hay una opción más a seguir. En sus tareas de gradle, puede establecer su ruta jdk deseada. (Sé que ha pasado un tiempo desde que se publicó la pregunta. Esta respuesta puede ayudar a alguien).

Haga clic derecho en la implementación o en cualquier otra tarea y seleccione "Abrir configuración de ejecución de Gradle ..."

ingrese la descripción de la imagen aquí

Luego navegue hasta "Java Home" y pegue la ruta de Java que desee.

ingrese la descripción de la imagen aquí

Tenga en cuenta que la tarea de gradle agregará bin. Así que no agregue el "bin" a la ruta.

Kiran
fuente
No veo tareas de gradle
Paul McCarthy
1

Para Windows, ejecute la tarea Gradle con el parámetro de ruta jdk 11 entre comillas

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

Como se ve en Gradle (complemento Eclipse)

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

Gradle usa el JDK que encuentre en su ruta (para verificar, use java -version). Alternativamente, puede establecer la variable de entorno JAVA_HOME para que apunte al directorio de instalación del JDK deseado.


Si está utilizando este complemento de Eclipse o Enide Studio 2014 , JAVA_HOME alternativo para usar (establecido en Preferencias) estará en la versión 0.15, consulte http://www.nodeclipse.org/history

Paul Verest
fuente
1
Hola Paul, en realidad, este es exactamente mi problema. Quiero definir un JDK diferente para las tareas de construcción de gradle que el definido en JAVA_HOME. Sin embargo, es bueno saber que habrá una entrada en el plugin de Eclipse para este :)
matón
Eclipse estándar permite definir variables de entorno por configuración de lanzamiento. Pero eso no es lo que intentamos con gradle. Abra un problema si explora esta pregunta más a fondo github.com/Nodeclipse/nodeclipse-1/issues
Paul Verest
0

Estoy usando Gradle 4.2. El JDK predeterminado es Java 9. En los primeros días de Java 9, Gradle 4.2 se ejecuta correctamente en JDK 8 (no JDK 9).

Configuré JDK manualmente de esta manera, en el archivo %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
Do Nhu Vy
fuente
0

Si está utilizando JDK 9+, puede hacer esto:

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

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

También puede ver los siguientes problemas relacionados:

Rosberg Linhares
fuente
0

Android Studio

Archivo> Estructura del proyecto> Ubicación del SDK> Ubicación del JDK>

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

GL

Instalar JDK

Braian Coronel
fuente
0

Si está utilizando Kotlin DSL, build.gradle.ktsagregue:

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

Por supuesto, supongo que tiene el sistema operativo Windows y el javaccompilador está en camino C:\bin\jdk-13.0.1\bin\javac. Para el sistema operativo Linux será similar.

Schakal
fuente
-1

Si solo desea configurarlo una vez para ejecutar un comando específico:

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