408

我无法弄清楚如何让这个工作。

设想:

  • 我有一个用 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 版本)。

任何答案都值得赞赏,我很感激每一个正确方向的提示。

4

21 回答 21

392

两种方式

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

或者:

  1. 在你的build.gradle

     compileJava.options.fork = true
     compileJava.options.forkOptions.executable = '/path_to_javac'
    
于 2014-01-19T03:18:02.723 回答
223

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

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

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

于 2016-06-22T05:21:12.410 回答
158

maven.compiler.source对于在搜索 Maven 属性(或)的 Gradle 等价物时出现在这里的人们<source>1.8</source>

在 build.gradle 你可以用

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

请参阅有关此的Gradle 文档

于 2017-06-28T09:55:53.637 回答
46

Gradle 6.7+ — 使用 Gradle 工具链支持

使用现代版本的 Gradle(6.7+ 版)执行此操作的正确方法是使用Gradle Java 工具链 支持

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

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

这也可以为个别任务设置。

注意:对于依赖于 Java 可执行文件或 Java home 的其他任务,请使用编译器元数据设置适当的选项。请参阅下面的 Kotlin 插件示例,版本 1.5.30 之前。

Gradle 尝试通过几种常见机制自动检测指定 JDK 的位置。如果自动检测不够,可以配置自定义位置。

科特林 1.5.30+

对于 Kotlin 1.5.30+,Kotlin 插件直接支持工具链

kotlin {
  jvmToolchain {
    (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of("11"))
  }
}

Kotlin 早期版本

为 1.5.30 之前的版本配置 Kotlin 编译器涉及使用工具链 API 来确定编译器,并将该信息传递给插件。其他基于编译器的插件可以以类似的方式进行配置。

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

tasks.withType<KotlinJvmCompile>().configureEach {
  kotlinOptions.jdkHome = compiler.get().metadata.installationPath.asFile.absolutePath
}
于 2021-03-02T16:46:39.910 回答
36

如果您遇到此问题Intellij IDE,请尝试此选项

  1. 设置 Gradle JVM 主页 在此处输入图像描述

  2. 在 Project 模块设置中设置 JDK 版本 在此处输入图像描述

  3. 检查模块中的 JDK 版本 在此处输入图像描述

于 2020-10-06T05:55:46.883 回答
25

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

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

于 2018-09-26T09:10:08.657 回答
9

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

于 2017-01-04T12:50:07.563 回答
8

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

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

在此处输入图像描述

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

在此处输入图像描述

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

于 2018-03-01T10:14:06.273 回答
8

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

org.gradle.java.home=<YOUR_JDK_PATH>
于 2021-01-25T10:50:55.727 回答
7

如果您使用的是 JDK 9+,则可以这样做:

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

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

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

于 2019-10-28T23:47:48.407 回答
6

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

于 2017-06-09T11:01:00.973 回答
5

对于 Windows 运行带有 jdk 11 路径参数的 gradle 任务

gradlew clean build -Dorg.gradle.java.home="c:/Program Files/Java/jdk-11"
于 2020-04-21T17:53:49.287 回答
3

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

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

还没有 IDE 集成,并且在 Windows 上需要一个像样的 shell。

于 2018-10-27T08:39:46.920 回答
3

对于 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)。

于 2021-03-25T08:51:41.777 回答
2

Gradle(Eclipse 插件)中所示

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

Gradle 使用它在您的路径中找到的任何 JDK(要检查,请使用 java -version)。或者,您可以将 JAVA_HOME 环境变量设置为指向所需 JDK 的安装目录。


如果您正在使用这个 Eclipse 插件或Enide Studio 2014,要使用的替代 JAVA_HOME(在 Preferences 中设置)将是 0.15 版,请参阅http://www.nodeclipse.org/history

于 2014-04-01T06:08:29.540 回答
2

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

只是因为它可能会节省我浪费的几个小时... IntelliJ -> Preferences -> Build, Execution, Deployment -> Build tools -> Maven -> Gradle

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

注意:该项目从命令行编译得很好

于 2020-08-05T23:03:48.077 回答
2

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

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
于 2021-04-27T13:49:41.090 回答
1

安卓工作室

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

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

总帐

安装 JDK

于 2020-02-22T21:36:45.247 回答
1

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

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

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

于 2020-04-04T07:37:25.027 回答
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
于 2017-09-29T04:00:52.367 回答
0

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

JAVA_HOME=/usr/lib/jvm/java-11-oracle/ gw build
于 2019-05-30T22:04:18.913 回答