我无法弄清楚如何让这个工作。
设想:
我有一个用 gradle 构建的应用程序
该应用程序使用 JavaFX
我想要的是
使用一个变量(为每个开发人员机器定义),它指向一个 JDK 的安装,它将用于构建整个应用程序 / 测试 / ...
我想过拥有 gradle.properties
文件,定义变量。就像是
JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>
我不想要的
将 JAVA_HOME 指向所需的 JDK
我可以接受很多建议:
一个定义系统环境变量的解决方案,我可以在我的 build.gradle 脚本中检查它
gradle.properties 中定义的变量
仅为构建上下文覆盖 JAVA_HOME 变量(类似于使用 JAVA_HOME=<我在其他地方定义的特殊 JDK 路径>)
其他我没想到的事情
问题:
如何将变量(如何定义,作为 gradle.properties 中的变量、系统环境变量……)连接到构建过程?
我有多个可用的 JDK7,需要指向一个特殊版本(最低 JDK_u 版本)。
任何答案都值得赞赏,我很感激每一个正确方向的提示。
org.gradle.java.home
设置仅适用于 gradle 守护进程,显然......无论如何,尝试将 fork 设置为 true 并将 forkOptions.executable 设置为您要使用的 jdk:link
两种方式
在 HOME_DIRECTORY 中的 .gradle 目录中的 gradle.properties 中设置 org.gradle.java.home=/path_to_jdk_directory
或者:
在你的 build.gradle compileJava.options.fork = true compileJava.options.forkOptions.executable = '/path_to_javac'
如果您在 gradle.properties 中添加 JDK_PATH,您的构建将依赖于该特定路径。而是使用以下命令行参数运行 gradle 任务
gradle build -Dorg.gradle.java.home=/JDK_PATH
这样,您的构建不依赖于某些具体路径。
/usr/lib/java/jdk/home
的软链接,它指向安装的 current 版本。当然,当您想要特定版本(例如 u51)时,您需要具体说明路径。还有一些工具想要启动 gradle 似乎并没有在他们给 gradle 的环境中设置 JDK。而且我从来没有将 JDK 设置为当前的 JAVA_HOME,除非它是一个开发会话。
PROGRA~1
(全部大写)或 DIR /X 告诉您的任何其他内容。
"... gradle itself (either standalone distribution or wrapper) uses JDK from JAVA_HOME environment variable or (if it is not set) from PATH".
我在调用 gradlew 之前指定了 JAVA_HOME 来解决这个问题。 (即env JAVA_HOME=/path/to/java gradlew war --stacktrace
)
对于在搜索 Maven 属性 maven.compiler.source
(或 <source>1.8</source>
)的 Gradle 等效项时出现在这里的人们:
在 build.gradle 你可以用
apply plugin: 'java'
sourceCompatibility = 1.8
targetCompatibility = 1.8
请参阅 Gradle documentation on this。
Gradle 6.7+ — 使用 Gradle 工具链支持
使用现代版本的 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 插件示例,版本 1.5.30 之前。
Gradle 尝试通过几种常见机制来auto-detect 指定 JDK 的位置。如果自动检测不够,可以配置 Custom locations。
科特林 1.5.30+
对于 Kotlin 1.5.30+,Kotlin 插件 supports toolchains directly:
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
}
java { }
扩展级别定义它们,但您仍然可以在 JavaCompile
任务级别定义它们。或者在 CompileOptions
上使用新的 release
标志。请参阅docs.gradle.org/current/userguide/…。具体java更新见github.com/gradle/gradle/issues/16628。
如果您遇到来自 Intellij IDE
的问题,请尝试此选项
设置 Gradle JVM Home 在 Project 模块设置中设置 JDK 版本 在 Modules 中检查 JDK 版本
如果您使用 gradle wrapper 执行,则可以使用 JDK 路径运行命令,如下所示
./gradlew -Dorg.gradle.java.home=/jdk_path_directory
通过在项目级别 gradle.properties
中指定,您可以轻松地指出您想要的 Java 版本。这将影响当前项目,而不是改变整个系统中每个项目的语言级别。
org.gradle.java.home=<YOUR_JDK_PATH>
Value 'C:Program FilesJavajdk-11.0.8' given for org.gradle.java.home Gradle property is invalid (Java home supplied is invalid)
请提供示例。
如果您使用的是 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
不应包含在版本控制系统中。
如果您使用的是 JDK 9+,则可以这样做:
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType<JavaCompile> {
options.compilerArgs.addAll(arrayOf("--release", "8"))
}
您还可以看到以下相关问题:
Gradle:[Java 9] 为 -release 编译器参数添加便捷方法
Gradle 的 Eclipse 插件:JDK API 兼容性应与 sourceCompatibility 选项匹配。
target
,为什么还需要设置 --release
?
还有另一种选择。在 Eclipse 中可用的 gradle 任务中,您可以设置所需的 jdk 路径。 (我知道问题发布已经有一段时间了。这个答案可以帮助别人。)
右键单击部署或任何其他任务,然后选择“打开 Gradle 运行配置...”
https://i.stack.imgur.com/AAAQn.png
然后导航到“Java Home”并粘贴所需的 Java 路径。
https://i.stack.imgur.com/CoLUP.png
请注意,bin 将由 gradle 任务本身添加。所以不要将“bin”添加到路径中。
我在我的 GRADLE_HOME/bin/gradle 文件中添加了这一行 - export JAVA_HOME=/path/to/java/version
对于 Windows 运行带有 jdk 11 路径参数的 gradle 任务
gradlew clean build -Dorg.gradle.java.home="c:/Program Files/Java/jdk-11"
对于 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)。
有一个 Gradle 插件可以自动下载/引导 JDK:
https://plugins.gradle.org/plugin/com.github.rmee.jdk-bootstrap
还没有 IDE 集成,并且在 Windows 上需要一个像样的 shell。
*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'
}*
在 flutter3.0 和 jdk11 安装后,这些步骤对我有用
https://i.stack.imgur.com/mwzaD.png
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
因此,我将 IntelliJ 用于我的 Android 项目,以下解决了 IDE 中的问题:
只是因为它可能会节省我浪费的几个小时... IntelliJ -> Preferences -> Build, Execution, Deployment -> Build tools -> Maven -> Gradle
并将 Gradle JVM 设置为 1.8 确保您还安装了 JDK 8...
注意:该项目从命令行编译得很好
有一个非常简单的方法。您可以尝试以下解决方案。
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
如果您只想设置一次以运行特定命令:
JAVA_HOME=/usr/lib/jvm/java-11-oracle/ gw build
如果您使用 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 操作系统将是类似的。
我正在使用 Gradle 4.2 。默认的 JDK 是 Java 9。在 Java 9 的早期,Gradle 4.2 在 JDK 8(不是 JDK 9)上正确运行。
我像这样在文件 %GRADLE_HOME%\bin\gradle.bat
中手动设置 JDK:
@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
感谢 this answer,即使 JAVA_HOME 设置正确,我也能够确定我的问题是 gradle 选择了错误的 JDK。
我原来的评论:
我的操作系统是 Linux,我的 JAVA_HOME 指向正确的路径。我什至用这个命令 gradle build -Dorg.gradle.java.home=$JAVA_HOME 来证明我的观点。我已经在 Ubuntu 中使用 snap 安装了 gradle,我猜它正在使用一些捆绑的 JDK。
我的解决方案:
我已经使用 snap 删除了 gradle,然后我通过下载他们的二进制文件手动安装了 gradle 并将其放入 PATH 中。
我的结论是 Ubuntu 上的 gradle snap 安装与一些较旧的 JDK 捆绑在一起。
gradle.properties
也可以在项目级别定义,请参阅 gradle.org/docs/current/userguide/build_environment.html./gradlew -Dorg.gradle.java.home=/path_to_jdk_directory
那样执行。如果您不想触摸gradle.properties
,那就太好了。