我不知道怎么把它修好。

场景:

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

我想要什么

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

我想过要有gradle。属性文件,定义变量。类似的

JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>

我不想要什么

将JAVA_HOME指向所需的JDK

我可以接受很多建议:

一个解决方案,它定义了一个系统环境变量,我可以在我的构建中检查。gradle脚本 在gradle.properties中定义的变量 仅为构建上下文重写JAVA_HOME变量(例如使用JAVA_HOME=<我在其他地方定义的特殊JDK路径定义>) 还有一件我没有想到的事

问题:

如何连接一个变量(如何定义,作为变量在gradle。属性,系统环境变量,…)到构建过程?

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

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


当前回答

由于这个答案,我能够确定我的问题是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捆绑在一起。

其他回答

两种方式

在它。org.gradle.java.home=/path_to_jdk_directory

or:

在你的房子里,gradle compileJava.options.fork = true 编译java .options. forkoptions .executable = '/path_to_javac'

如果你正在使用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路径。文件的地方。属性不应该包含在版本控制系统中。

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

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 6.7+ -使用Gradle工具链支持

在现代版本的Gradle(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的位置。如果自动检测不够,可以配置自定义位置。

Kotlin 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
}

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

org.gradle.java.home=<YOUR_JDK_PATH>