如何告诉Gradle使用特定的JDK版本?


283

我不知道该如何工作。

场景:

  • 我有一个用gradle构建的应用程序
  • 该应用程序使用JavaFX

我想要的是

  • 使用一个变量(针对每个开发人员机器定义),该变量指向JDK的安装,该安装将用于构建整个应用程序/测试/ ...

我考虑过要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.homegradle.properties文件中设置?链接
Ray Stojonic

在eclipse中,您可以在项目中创建“产品配置文件”,然后可以将jdk与产品打包在一起。无需指定环境变量。
mdanaci

3
@RayStojonic:我只是尝试了一下,但是gradle仍然使用JAVA_HOME JDK来构建:(
欺负者

@mdanaci:我真的希望我能避免这种情况,因为老实说我不想将JDK置于版本控制之下(如果我使用您的建议,那将是后果),因为任何开发人员都必须能够打包应用程序。另外,我以这种方式看到CI服务器的问题。无论如何,谢谢您的建议:)
欺负

3
从一年前开始,该org.gradle.java.home设置仅适用于gradle守护程序,显然...无论如何,请尝试将fork设置为true并将forkOptions.executable设置为您要使用的jdk:链接
Ray Stojonic

Answers:


292

两种方式

  1. 在您设置gradle.properties.gradle目录中HOME_DIRECTORYorg.gradle.java.home=/path_to_jdk_directory

要么:

  1. 在你的 build.gradle

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

22
gradle.properties可以在项目级别上定义过,看到gradle.org/docs/current/userguide/build_environment.html
保罗Fulgoni

143
如果您正在使用gradle包装器执行,则也可以像 ./gradlew -Dorg.gradle.java.home=/path_to_jdk_directory。如果您不想触摸,那就很好gradle.properties
david.schreiber,2015年

26
问题是如何设置VERSION,而不是JDK PATH,不是吗?
DIMS

38
这样,我无法与其他开发人员共享项目,这些开发人员的java路径不同。
DIMS

10
应该澄清选项1和2之间的区别:在选项1中,我们设置了让gradle自身运行的JVM,该JVM也将用于运行gradle任务(注意javac本身是一个Java应用程序),而在选项2我们只是将javac设置为在其自己的JVM中生成。如果出于某种原因,我们需要特定的JVM用于gradle(例如,为Java 8编译了给定的gradle插件),那么我们将被迫诉诸于分叉一个单独的JVM进行编译。
巴塞尔Shishani

147

如果在gradle.properties中添加JDK_PATH,构建将依赖于该特定路径。而是使用以下命令行参数运行gradle任务

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

这样,您的构建就不依赖于某些具体路径。


3
在Eclipse(Neon,4.6)中,您还可以在Gradle构建配置中设置Java Home(请参见选项卡“ Java Home”)。如果您有20多个构建工作,这将是一件繁琐的工作...我认为Gradle确实需要从系统配置中选择Java Home目录!
Markus L

1
这是一个公平的观点。我有一个软链接/usr/lib/java/jdk/home,它指向已安装的当前版本。当然,当您需要特定版本(例如u51)时,则需要具体说明路径。另外,有些工具希望启动gradle似乎并没有在他们提供gradle的环境中设置JDK。而且我从来没有将JDK设置为当前的JAVA_HOME,除非它是开发会话。

6
请注意,JDK_PATH在Windows上不能有空格,即使它用引号引起来:您也已经将“程序文件”更改为PROGRA~1(全部大写)或DIR / X告诉您的其他任何内容。
Noumenon

2
如果您正在使用gradle包装器,请像这样调用命令。
mirmdasif

3
"... gradle itself (either standalone distribution or wrapper) uses JDK from JAVA_HOME environment variable or (if it is not set) from PATH".我在gradlew调用之前指定了JAVA_HOME来解决此问题。(即env JAVA_HOME=/path/to/java gradlew war --stacktrace
TekiusFanatikus

110

对于在搜索Maven属性maven.compiler.source(或<source>1.8</source>)的Gradle等效项时到达此处的人们:

在build.gradle中,您可以使用

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

请参阅此的Gradle文档


1
这对我
有用,

9
@morgwai-但这不是问题的答案,它明确询问“我想要[设置]一个变量(针对每个开发人员计算机定义),该变量指向将用于构建的JDK的安装整个应用程序”。赞成的答案是正确的;这个答案是一个完全不同的问题。
Jules

诸如Javadoc任务(试图根据Java 9生成Javadoc并在我的项目中指定使用Java 8的模块)之类的工具忽略了这一点
CLOVIS

20

如果使用gradle wrapper执行,则可以使用JDK路径运行命令,如下所示

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


5

如果您正在使用linux和gradle包装器,则可以使用以下解决方案。

将路径添加到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

还有另一种选择。在gradle任务中,您可以设置所需的jdk路径。(我知道问题发布已经有一段时间了。此答案可以帮助某人。)

右键单击部署或任何其他任务,然后选择“打开Gradle运行配置...”

在此处输入图片说明

然后导航到“ Java Home”并粘贴所需的Java路径。

在此处输入图片说明

请注意,bin将由gradle任务本身添加。因此,请勿在路径中添加“ bin”。


看不到gradle任务
Paul McCarthy



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
嗨,保罗,实际上,这正是我的问题。我想为gradle-build任务定义一个不同于JAVA_HOME中定义的JDK。但是,很高兴知道在eclipse插件中将有一个条目:)
bully 2014年

标准Eclipse允许为每个启动配置定义环境变量。但这不是我们尝试gradle的方式。如果您进一步探讨此问题,请打开一个问题github.com/Nodeclipse/nodeclipse-1/issues
Paul Verest 2014年

0

我正在使用Gradle 4.2。默认的JDK是Java9。在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

如果您使用的是Kotlin DSL,请build.gradle.kts添加:

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

当然,我假设您有Windows操作系统,并且javac编译器在path中C:\bin\jdk-13.0.1\bin\javac。对于Linux OS,将类似。


-1

如果只想设置一次以运行特定命令:

JAVA_HOME=/usr/lib/jvm/java-11-oracle/ gw build
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.