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

我不知道怎么把它修好。

场景:

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

我想要什么

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

我考虑过使用gradle.properties文件来定义变量。类似的

JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>

我不想要什么

  • JAVA_HOME指向所需的JDK

我可以接受很多建议:

  • 一个解决方案,它定义了一个系统环境变量,我可以在我的构建中检查。gradle脚本
  • 在gradle.properties中定义的变量
  • 仅为构建上下文重写JAVA_HOME变量(类似use JAVA_HOME=<my special JDK path defined somewhere else defined>)
  • 还有一件我没有想到的事

问题:

  • 如何将一个变量(如何定义,作为gradle.properties中的变量,系统环境变量,…)连接到构建过程?

我有多个可用的JDK7,需要指向一个特殊版本(最小JDK_u版本)。

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

613388 次浏览

两种方式

  1. 在你的HOME_DIRECTORY集中的.gradle目录中的gradle.properties

或者:

  1. 在你的build.gradle

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

Gradle (Eclipse插件)所示

.

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

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


如果您正在使用此Eclipse插件或Enide工作室2014,可使用的替代JAVA_HOME(在Preferences中设置)将在0.15版本中,参见http://www.nodeclipse.org/history

如果你在gradle.properties中添加JDK_PATH,你的构建就会依赖于那个特定的路径。 相反,使用以下命令行参数

运行它的任务
gradle build -Dorg.gradle.java.home=/JDK_PATH

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

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

添加路径到本地。属性文件:

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不应该包含在版本控制系统中。

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

对于那些在Gradle中搜索Maven属性maven.compiler.source(或<source>1.8</source>)的人:

在构建。Gradle你可以实现这一点

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

参见这方面的Gradle文档

Gradle 7 +

从Gradle 7开始,你也可以使用release属性,它利用了JDK 9 --release编译器参数:

tasks.withType(JavaCompile) {
options.release = 8
}

(感谢佩德罗Lamarão)

我使用的是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

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

右键单击部署或任何其他任务,选择“Open Gradle Run Configuration…”

enter image description here

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

enter image description here

请注意,bin将由gradle任务本身添加。所以不要加上“bin”;到小路上去。

如果您正在使用gradle包装器执行,您可以像下面这样使用JDK路径运行该命令

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

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

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

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

如果你只是想设置它一次来运行一个特定的命令:

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

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

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


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

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

Android工作室

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

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

GL

安装JDK

如果你正在使用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操作系统,情况类似。

对于windows运行gradle任务,jdk 11的路径参数在引号中

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

所以,我使用IntelliJ为我的Android项目,以下解决了IDE中的问题:

只是因为它可能会为别人节省我浪费的几个小时… IntelliJ→偏好→构建,执行,部署->构建工具>Maven→Gradle < / p >

和设置Gradle JVM为1.8 确保你也安装了JDK 8…< / p >

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

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

  1. 设置Gradle JVM Home enter image description here < / p >

  2. 在“Project”模块设置中设置JDK版本 enter image description here < / p >

  3. 查看模块中的JDK版本 enter image description here < / p >

你可以在项目级别gradle.properties中指定你想要的Java版本。这将影响当前项目,而不是为整个系统中的每个项目更改语言级别。

org.gradle.java.home=<YOUR_JDK_PATH>

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

在现代版本的Gradle (version 6.7+)中,正确的方法是使用Gradle Java工具链 支持

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

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

这也可以设置为个人的任务

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

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

芬兰湾的科特林1.7.20 +

对于Kotlin 1.7.20+, Kotlin插件直接支持工具链并具有简化的语法:

kotlin {
jvmToolchain(17)
}

芬兰湾的科特林1.5.30 +

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

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

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
}

对于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"

这个命令将用调试变体编译你的项目,并在2个文件夹中输出2个apks(调试+发布)。

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

sudo update-alternatives --config java

更新java版本后,检查Gradle当前JVM的版本,以确保应用了这个更改。

gradle -v

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

多亏了这个答案,我能够识别出我的问题是gradle选择了错误的JDK,即使JAVA_HOME设置正确。

我最初的评论是:

我的操作系统是Linux,我的JAVA_HOME指向正确的路径。我甚至使用过gradle build -Dorg.gradle.java。home=$JAVA_HOME来证明我的观点。我已经在Ubuntu中使用snap安装了gradle,我猜它使用了一些捆绑的JDK。

我的解决方案:

我已经删除了gradle使用snap,然后我手动安装gradle下载他们的二进制文件,并把它放在PATH。

我的结论是,Ubuntu上的gradle snap安装与一些较老的JDK捆绑在一起。

*gradle.properties
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
org.gradle.java.home=C\:\\Program Files\\Java\\jdk-11.0.15
-------------------------------------------------------------------
**build.gradle**
android {
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
compileOptions {
sourceCompatibility 11
targetCompatibility 11
}
kotlinOptions {
jvmTarget = '11'
useIR = true
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}*

After flutter3.0 &Jdk11安装这些步骤对我来说很有效