Como digo à Gradle para usar uma versão específica do JDK?

284

Não consigo descobrir para fazer isso funcionar.

Cenário:

  • Eu tenho um aplicativo criado com gradle
  • O aplicativo usa JavaFX

O que eu quero

  • Use uma variável (definida por máquina do desenvolvedor) que aponte para a instalação de um JDK que será usado para criar todo o aplicativo / testes / ...

Pensei em ter o gradle.propertiesarquivo, definindo a variável. Algo como

JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>

O que eu não quero

  • aponte JAVA_HOMEpara o JDK desejado

Eu poderia viver com muitas sugestões:

  • uma solução que define uma variável de ambiente do sistema que eu posso verificar no meu script build.gradle
  • uma variável definida em gradle.properties
  • substituindo a variável JAVA_HOME apenas para o contexto de construção (algo como use JAVA_HOME=<my special JDK path defined somewhere else defined>)
  • outra coisa que eu não pensei

Questão:

  • Como conectar uma variável (como já definida, como variável na gradle.propertiesvariável de ambiente do sistema, ...) ao processo de compilação?

Eu tenho mais de um JDK7 disponível e preciso apontar para uma versão especial (versão mínima do JDK_u).

Qualquer resposta é apreciada e sou grata por cada dica na direção certa.

valentão
fonte
6
Você já tentou definir org.gradle.java.homeno gradle.propertiesarquivo? link
Ray Stojonic 28/08
No eclipse, você pode criar "arquivo de configuração do produto" no seu projeto e pode compactar o jdk com o seu produto. Não há necessidade de especificar variáveis ​​env.
precisa saber é
3
@RayStojonic: Eu apenas tentei, mas o gradle ainda usa o JAVA_HOME JDK para construir :(
bully
@mdanaci: Eu realmente esperava poder evitar isso, porque sinceramente não quero assumir um JDK sob controle de versão (o que seria a consequência se eu usasse sua sugestão), já que qualquer desenvolvedor deve poder compactar o aplicativo. Além disso, vejo problemas com o servidor de IC dessa maneira. Obrigado pela sua de qualquer maneira sugestão :)
valentão
3
Há um ano, a org.gradle.java.homeconfiguração se aplica apenas ao gradle daemon, aparentemente ... De qualquer forma, tente definir fork como true e forkOptions.executable para o jdk que você deseja usar: link
Ray Stojonic

Respostas:

292

Dois caminhos

  1. Em gradle.propertiesno .gradlediretório em seu HOME_DIRECTORYconjuntoorg.gradle.java.home=/path_to_jdk_directory

ou:

  1. Na tua build.gradle

    compileJava.options.fork = true
    compileJava.options.forkOptions.executable = /path_to_javac
Primeiro Zero
fonte
23
A gradle.propertiespode ser definido ao nível do projecto também, ver gradle.org/docs/current/userguide/build_environment.html
Paolo Fulgoni
143
Se você estiver executando usando o wrapper gradle, também poderá fazê-lo ./gradlew -Dorg.gradle.java.home=/path_to_jdk_directory. Bom se você não quiser tocar gradle.properties.
David.schreiber
26
A questão era como definir VERSION, não JDK PATH, não era?
Dims 05/03
39
Dessa forma, não posso compartilhar o projeto com outros desenvolvedores, que possuem java em caminhos diferentes.
Dims
10
Há uma diferença entre as opções 1 e 2 que devem ser esclarecidas: na opção 1, estamos configurando a JVM para que o próprio gradle seja executado sob o qual também será usado para executar a tarefa do compilador (observe que o próprio javac é um aplicativo java), enquanto em opção 2, estamos apenas configurando o javac para ser gerado em sua própria JVM. Se, por qualquer motivo, precisarmos de uma JVM específica para gradle (por exemplo, um determinado plugin gradle é compilado para, por exemplo, Java 8), seríamos forçados a recorrer à bifurcação de uma JVM separada para o processo de compilação.
Basel Shishani
147

Se você adicionar JDK_PATH em gradle.properties, sua construção se tornará dependente desse caminho específico. Em vez disso, execute a tarefa gradle com o seguinte parâmetro de linha de comando

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

Dessa forma, sua compilação não depende de algum caminho concreto.

mirmdasif
fonte
3
No Eclipse (Neon, 4.6), você também pode definir o Java Home na configuração de construção do Gradle (consulte a guia "Java Home"). Este é um trabalho tedioso se você tiver mais de 20 trabalhos de compilação ... Acho que o Gradle realmente precisa escolher o diretório Java Home da configuração do sistema!
Markus G
1
Este é um ponto justo. Eu tenho um link virtual chamado /usr/lib/java/jdk/homeque aponta para a versão atual instalada. É claro que quando você deseja uma versão específica (por exemplo, u51), precisa ser específico sobre o caminho. Além disso, algumas ferramentas que desejam iniciar o gradle não parecem definir o JDK no ambiente que dão ao gradle. E eu nunca defini o JDK como o JAVA_HOME atual, a menos que seja uma sessão de desenvolvimento.
vai
6
Observe que o JDK_PATH não pode ter espaços no Windows, mesmo que esteja entre aspas: você alterou "Arquivos de Programas" para PROGRA~1(todas em maiúsculas) ou o que mais o DIR / X informar.
Noumenon 23/01
2
Se você estiver usando o gradle wrapper, chame o comando desta forma ./gradlew build -Dorg.gradle.java.home = / JDK_PATH Substitua JDK_PATH pelo seu local jdk em seu ambiente 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".Especifiquei o JAVA_HOME antes da chamada gradlew para corrigir isso. (ie. env JAVA_HOME=/path/to/java gradlew war --stacktrace)
TekiusFanatikus 11/11
110

Para as pessoas que terminam aqui ao pesquisar o equivalente Gradle da propriedade Maven maven.compiler.source(ou <source>1.8</source>):

No build.gradle, você pode conseguir isso com

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

Veja a documentação da Gradle sobre isso .

Geert
fonte
1
Isso funcionou para mim, mas eu tive que mudar "aplicar plug-in 'java'" para "aplicar plugin: 'java'" (aviso do cólon)
will.fiset
9
@orgwai - exceto que essa não é a resposta para a pergunta, que pergunta explicitamente "O que eu quero [é definir] uma variável (definida por máquina do desenvolvedor) que aponta para a instalação de um JDK que será usado para a construção toda a aplicação ". As respostas votadas estão corretas; essa resposta é para uma pergunta totalmente diferente.
Jules
Esta é ignorado por ferramentas tais como a tarefa Javadoc (que tenta gerar o javadoc de acordo com Java 9 com módulos sobre meu projeto que é especificado para usar Java 8)
CLOVIS
20

Se você estiver executando usando o gradle wrapper, poderá executar o comando com o caminho JDK, como a seguir

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

Vittal Pai
fonte
5

Se você estiver usando o linux e o gradle wrapper, poderá usar a seguinte solução.

Inclua o caminho no arquivo local.properties:

javaHome=<path to JDK>

Adicione ao seu arquivo 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

Nesta solução, cada desenvolvedor pode definir seu próprio caminho JDK. O arquivo local.propertiesnão deve ser incluído no sistema de controle de versão.

Sylwano
fonte
5

Adicionei esta linha no meu arquivo GRADLE_HOME / bin / gradle - export JAVA_HOME=/path/to/java/version

Manoj
fonte
4

Há mais uma opção a seguir. Nas tarefas de classificação, você pode definir o caminho jdk desejado. (Eu sei que já faz um tempo desde que a pergunta foi publicada. Esta resposta pode ajudar alguém.)

Clique com o botão direito do mouse na implantação ou em qualquer outra tarefa e selecione "Abrir configuração de execução do gradle ..."

insira a descrição da imagem aqui

Em seguida, navegue até "Java Home" e cole o caminho java desejado.

insira a descrição da imagem aqui

Observe que bin será adicionado pela própria tarefa gradle. Portanto, não adicione o "bin" ao caminho.

Kiran
fonte
Não vejo tarefas Gradle
Paul McCarthy
1

Para o Windows, execute a tarefa gradle com o parâmetro de caminho do jdk 11 entre aspas

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

Como visto em Gradle (plugin Eclipse)

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

Gradle usa o JDK que encontrar no seu caminho (para verificar, use a versão java). Como alternativa, você pode configurar a variável de ambiente JAVA_HOME para apontar para o diretório de instalação do JDK desejado.


Se você estiver usando este plug-in do Eclipse ou o Enide Studio 2014 , o JAVA_HOME alternativo a ser usado (definido em Preferências) estará na versão 0.15, consulte http://www.nodeclipse.org/history

Paul Verest
fonte
1
Oi Paul, na verdade, exatamente esse é o meu problema. Eu quero definir um JDK diferente para tarefas de construção de gradiente do que o definido em JAVA_HOME. Embora, é bom saber que haverá uma entrada no eclipse plugin para este :)
valentão
O Eclipse padrão permite definir variáveis ​​de ambiente por configuração de ativação. Mas não é isso que tentamos com gradle. Abra um problema se você explorar esta questão mais github.com/Nodeclipse/nodeclipse-1/issues
Paul Verest
0

Estou usando o Gradle 4.2. O JDK padrão é Java 9. No início do Java 9, o Gradle 4.2 é executado no JDK 8 corretamente (não no JDK 9).

Defino o JDK manualmente assim, no arquivo %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
fonte
0

Se você estiver usando o JDK 9+, poderá fazer o seguinte:

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

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

Você também pode ver os seguintes problemas relacionados:

Rosberg Linhares
fonte
0

Android Studio

Arquivo> Estrutura do projeto> Local do SDK> Local do JDK>

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

GL

Instale o JDK

Braian Coronel
fonte
0

Se você estiver usando o Kotlin DSL, build.gradle.ktsadicione:

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

Claro, estou supondo que você tenha o sistema operacional Windows e o javaccompilador esteja no caminho C:\bin\jdk-13.0.1\bin\javac. Para Linux OS será similar.

Schakal
fonte
-1

Se você quiser apenas configurá-lo uma vez para executar um comando específico:

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