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

时间:2013-08-28 12:05:50

标签: java gradle build.gradle

我无法弄明白这一点。

情景:

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

我想要什么

  • 使用一个变量(每个开发人员机器定义),该变量指向将用于构建整个应用程序/ tests / ...的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版本)。

任何答案都表示赞赏,我很感谢每一个提示都朝着正确的方向发展。

21 个答案:

答案 0 :(得分:209)

两种方式

  1. gradle.properties.gradle
  2. HOME_DIRECTORY目录的org.gradle.java.home=/path_to_jdk_directory

    或:

    1. build.gradle

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

答案 1 :(得分:92)

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

运行 gradle task
gradle build -Dorg.gradle.java.home=/JDK_PATH

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

答案 2 :(得分:64)

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

在build.gradle中,您可以使用

实现此目的
apply plugin: 'java'
sourceCompatibility = 1.8
targetCompatibility = 1.8

请参阅Gradle documentation on this

答案 3 :(得分:16)

使用现代版本的 Gradle(版本 6.7+)执行此操作的正确方法是使用 Gradle Java Toolchain support

以下块,当 java 插件应用于当前项目时,将在所有 java 编译、测试和 javadoc 任务中使用 Java 11:

java {
  toolchain {
    languageVersion.set(JavaLanguageVersion.of(11))
  }
}

这也可以为 individual tasks 设置。

注意:对于 other tasks relying on a Java executable or Java home,使用编译器元数据来设置适当的选项。以下是 Kotlin 编译器的示例:

val compiler = javaToolchains.compilerFor {
  languageVersion.set(JavaLanguageVersion.of(11))
}

tasks.withType<KotlinJvmCompile>().configureEach {
  kotlinOptions.jdkHome = compiler.get().metadata.installationPath.asFile.absolutePath
}

答案 4 :(得分:7)

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

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

答案 5 :(得分:4)

对于Windows,在引号中使用jdk 11路径参数运行gradle任务

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

答案 6 :(得分:4)

如果您使用的是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不应包含在版本控制系统中。

答案 7 :(得分:4)

您可以通过在项目级别 gradle.properties 中指定来轻松指向所需的 Java 版本。这将影响当前项目,而不是改变整个系统中每个项目的语言级别。

org.gradle.java.home=<YOUR_JDK_PATH>

答案 8 :(得分:3)

我在GRADLE_HOME / bin / gradle文件中添加了这一行 - export JAVA_HOME=/path/to/java/version

答案 9 :(得分:3)

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

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

enter image description here

然后导航到“Java Home”并粘贴您想要的java路径。

enter image description here

请注意,bin将由gradle任务本身添加。所以不要在路径中添加“bin”。

答案 10 :(得分:2)

如果您有Intellij的问题,请尝试以下选项

  1. 设置Gradle JVM主页 enter image description here

  2. 在项目模块设置中设置JDK版本 enter image description here

答案 11 :(得分:2)

有一个Gradle插件可以自动下载/引导JDK:

https://plugins.gradle.org/plugin/com.github.rmee.jdk-bootstrap

尚无IDE集成,并且Windows上还需要一个不错的外壳。

答案 12 :(得分:1)

对于 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 assembleDebug -Dorg.gradle.java.home="E:\AndroidStudio\jre"

此命令将使用 Debug 变体编译您的项目,并在 2 个文件夹中输出 2 个 apks(debug + release)。

答案 13 :(得分:1)

Android Studio

文件>项目结构> SDK位置> JDK位置>

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

GL

Install JDK

答案 14 :(得分:1)

Gradle (Eclipse plugin)

所示

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

答案 15 :(得分:1)

因此,我将IntelliJ用于我的Android项目,以下代码解决了IDE中的问题:

只是因为它可能会节省我几个小时所花的时间... IntelliJ->首选项->构建,执行,部署->构建工具-> Maven-> Gradle

并将 Gradle JVM 设置为1.8 确保您还安装了JDK 8 ...

注意:从命令行编译项目就可以了

答案 16 :(得分:0)

有一个非常简单的方法。您可以尝试以下解决方案。

sudo update-alternatives --config java

更新您的 Java 版本后,让我们检查 Gradle 当前 JVM 的版本以确保应用此更改。

gradle -v

有关更多详细信息,请查看您的 gradlew 文件(在类 Unix 操作系统中)或 gradlew.bat 文件(在 Window 操作系统中)以了解 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

答案 17 :(得分: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 OS,将与此类似。

答案 18 :(得分:0)

如果您使用的是JDK 9+,则可以执行以下操作:

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

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

您还可以看到以下相关问题:

答案 19 :(得分:0)

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

+------+---------------------------------+------------+
| key  |          last_updt_ts           |    data    |
+------+---------------------------------+------------+
| 1000 | 30-MAY-19 09.57.47.874000000 AM | new_data   |
| 1001 | 30-MAY-19 09.50.47.874000000 AM | new_data   |
| 1000 | 30-MAY-19 09.57.47.774000000 AM | old_data   |
| 1001 | 30-MAY-19 09.50.47.774000000 AM | old_data   |
| 1000 | 30-MAY-19 09.57.00.874000000 AM | older_data |
| 1001 | 30-MAY-19 09.49.00.874000000 AM | older_data |
+------+---------------------------------+------------+

答案 20 :(得分: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