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

bul*_*lly 242 java gradle build.gradle

我无法弄清楚这是否有效.

场景:

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

我想要的是

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

我想过拥有gradle.properties文件,定义变量.就像是

JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>
Run Code Online (Sandbox Code Playgroud)

我不想要的

  • 指向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版本).

任何答案都表示赞赏,我感谢每一个提示正确的方向.

Fir*_*ero 244

两种方式

  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
    
    Run Code Online (Sandbox Code Playgroud)

  • 如果使用gradle包装器执行,也可以像`./gradlew -Dorg.gradle.java.home =/path_to_jdk_directory`那样执行.好的,如果你不想触摸`gradle.properties`. (110认同)
  • 这样我就无法与其他开发人员共享项目,这些开发人员在不同的路径中拥有java. (37认同)
  • 问题是如何设置VERSION,而不是JDK PATH,不是吗? (21认同)
  • `gradle.properties`也可以在项目级别定义,请参阅http://www.gradle.org/docs/current/userguide/build_environment.html (20认同)
  • 应该澄清选项1和2之间的区别:在选项1中,我们设置JVM以使gradle本身运行,其下也将用于运行编译器任务(注意javac本身是一个java应用程序),而在选项2我们只是将javac设置为在自己的JVM中生成.如果由于某种原因我们需要一个特定的JVM用于gradle(例如,为Java 8编译一个给定的gradle插件),那么我们将不得不求助于为编译过程分配一个单独的JVM. (8认同)
  • @Dims就是你如何做到的,你在不同的路径中有不同版本的Java,然后你想要使用哪个版本给出该路径.javac是一个编译器(实际上将Java代码编译为JDK中的字节代码的程序),它不是托管在Maven或Ivy存储库中,就像依赖库一样. (4认同)
  • @Nezneika我也在Mac上,就我而言,我必须编写`org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home` (2认同)

mir*_*sif 117

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

gradle build -Dorg.gradle.java.home=/JDK_PATH
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,JDK_PATH在Windows上不能有空格,即使它在引号中:您已将"Program Files"更改为"PROGRA~1"(全部大写)或DIR/X告诉您的任何其他内容. (4认同)
  • 在Eclipse(Neon,4.6)中,您还可以在Gradle构建配置中设置Java Home(请参见"Java Home"选项卡).如果您有20多个构建作业,这是一项有些繁琐的工作......我认为Gradle确实需要从系统配置中选择Java Home目录! (3认同)
  • `"... gradle本身(独立分发或包装)使用来自JAVA_HOME环境变量的JDK或(如果未设置)来自PATH".我在gradlew调用之前指定了JAVA_HOME来修复它.(即``env JAVA_HOME =/path/to/java gradlew war --stacktrace`) (3认同)
  • 如果您正在使用gradle包装器,请像这样调用命令。 (2认同)

Gee*_*ert 89

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

在build.gradle中,您可以实现此目的

apply plugin: 'java'
sourceCompatibility = 1.8
targetCompatibility = 1.8
Run Code Online (Sandbox Code Playgroud)

请参阅Gradle文档.

  • 我向 Google 询问“gradle指定jdk版本”,它把我带到了这里。我实际上正在寻找的答案就是这个,无论问题实际上是关于什么的。因为有用所以点赞。 (8认同)
  • @morgwai - 除了这个*不是问题的答案,它明确地询问"我想要的是[设置]一个变量(每个开发者机器定义),它指向将要使用的JDK的安装用于构建整个应用程序".赞成的答案是正确的; 这个答案是一个完全不同的问题. (7认同)
  • Javadoc 任务等工具会忽略这一点(它尝试根据 Java 9 以及我的项目中指定使用 Java 8 的模块生成 javadoc) (3认同)
  • 虽然这不是这个问题的确切答案,但这种方法实际上不仅仅适用于一个系统。大多数搜索此问题的人希望看到此答案而不是其他答案。 (3认同)
  • 对于未来的人来说,Gradle 的“JavaCompile”任务现在允许设置“release”选项。https://docs.gradle.org/current/dsl/org.gradle.api.tasks.compile.CompileOptions.html#org.gradle.api.tasks.compile.CompileOptions:release (3认同)

Ram*_*man 23

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

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

java {
  toolchain {
    languageVersion.set(JavaLanguageVersion.of(11))
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • @jumping_monkey 您无法在“java { }”扩展级别定义它们,但您仍然可以在“JavaCompile”任务级别定义它们。或者在“CompileOptions”上使用新的“release”标志。请参阅 https://docs.gradle.org/current/userguide/building_java_projects.html#sec:java_cross_compilation。关于具体的java更新,请参见https://github.com/gradle/gradle/issues/16628。 (2认同)

jaf*_*mlp 21

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

  1. 设置 Gradle JVM 主页 在此处输入图片说明

  2. 在项目模块设置中设置JDK版本 在此处输入图片说明

  3. 检查模块中的JDK版本 在此处输入图片说明

  • 这是针对 IDE 的 (3认同)

Yek*_*ğlu 18

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

org.gradle.java.home=<YOUR_JDK_PATH>
Run Code Online (Sandbox Code Playgroud)


Vit*_*Pai 13

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

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


syl*_*ano 9

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

将路径添加到 local.properties 文件:

javaHome=<path to JDK>
Run Code Online (Sandbox Code Playgroud)

添加到您的 gradlew 脚本文件:

DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
source $DIR/local.properties 2>/dev/null

if ! [ -z "$javaHome" ]
then
  JAVA_HOME=$javaHome
fi
Run Code Online (Sandbox Code Playgroud)

在这个方案中,每个开发者都可以设置自己的JDK路径。文件local.properties不应包含在版本控制系统中。


Kir*_*ran 7

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

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

在此处输入图片说明

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

在此处输入图片说明

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

  • 这是针对 Eclipse 的吗?如果是,请在您的答案中注明。 (2认同)

小智 7

对于 Windows 运行 gradle 任务,并在引号中包含 jdk 11 路径参数

gradlew clean build -Dorg.gradle.java.home="c:/Program Files/Java/jdk-11"
Run Code Online (Sandbox Code Playgroud)


Man*_*noj 6

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


Lic*_*ius 6

对于 Windows,打开 cmd 并进入项目根目录,然后执行如下命令:

gradlew构建-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 个 apk(调试 + 发布)。


btm*_* me 6

gradle.properties

  org.gradle.jvmargs=-Xmx1536M
    android.useAndroidX=true
    android.enableJetifier=true
    org.gradle.java.home=C\:\\Program Files\\Java\\jdk-11.0.15

-------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

构建.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'
        }
Run Code Online (Sandbox Code Playgroud)

在 flutter3.0 和 jdk11 安装之后,这些步骤对我有用


Ros*_*res 5

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

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

tasks.withType<JavaCompile> {
    options.compilerArgs.addAll(arrayOf("--release", "8"))
}
Run Code Online (Sandbox Code Playgroud)

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

  • 问题:如果我们已经设置了“target”,为什么还需要设置“--release”? (3认同)