[英]How do I tell Gradle to use specific JDK version?
我無法弄清楚如何讓這個工作。
設想:
我想要的是
我考慮過使用gradle.properties
文件來定義變量。 就像是
JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>
我不想要的
JAVA_HOME
指向所需的 JDK我可以接受很多建議:
use JAVA_HOME=<my special JDK path defined somewhere else defined>
)問題:
gradle.properties
中的變量、系統環境變量……)連接到構建過程?我有多個可用的 JDK7,需要指向一個特殊版本(最低 JDK_u 版本)。
任何答案都值得贊賞,我很感激每一個正確方向的提示。
兩種方式
gradle.properties
中的.gradle
目錄中的HOME_DIRECTORY
中設置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
這樣,您的構建不依賴於某些具體路徑。
對於在搜索 Maven 屬性maven.compiler.source
(或<source>1.8</source>
)的 Gradle 等效項時結束的人:
在 build.gradle 你可以用
apply plugin: 'java'
sourceCompatibility = 1.8
targetCompatibility = 1.8
請參閱有關此的Gradle 文檔。
使用現代版本的 Gradle(6.7+ 版)執行此操作的正確方法是使用Gradle Java 工具鏈支持。
以下塊,當 java 插件應用於當前項目時,將在所有 java 編譯、測試和 javadoc 任務中使用 Java 11:
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(11))
}
}
這也可以為個別任務設置。
注意:對於依賴於 Java 可執行文件或 Java home 的其他任務,請使用編譯器元數據設置適當的選項。 這是 Kotlin 編譯器的示例(但如果您使用的是 Kotlin 1.5.30+,請不要使用此方法,請參見下文):
val compiler = javaToolchains.compilerFor {
languageVersion.set(JavaLanguageVersion.of(11))
}
tasks.withType<KotlinJvmCompile>().configureEach {
kotlinOptions.jdkHome = compiler.get().metadata.installationPath.asFile.absolutePath
}
對於 Kotlin 1.5.30+,Kotlin 插件直接支持工具鏈:
kotlin {
jvmToolchain {
(this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of("11"))
}
}
如果您使用 gradle wrapper 執行,則可以使用 JDK 路徑運行命令,如下所示
./gradlew -Dorg.gradle.java.home=/jdk_path_directory
如果您使用的是 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
不應包含在版本控制系統中。
通過在項目級別gradle.properties
中指定,您可以輕松地指出您想要的 Java 版本。 這將影響當前項目,而不是改變整個系統中每個項目的語言級別。
org.gradle.java.home=<YOUR_JDK_PATH>
如果您使用的是 JDK 9+,則可以這樣做:
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType<JavaCompile> {
options.compilerArgs.addAll(arrayOf("--release", "8"))
}
您還可以看到以下相關問題:
-release
編譯器參數添加便捷方法我在我的 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"
*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 安裝后,這些步驟對我有用
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
有一個 Gradle 插件可以自動下載/引導 JDK:
https://plugins.gradle.org/plugin/com.github.rmee.jdk-bootstrap
還沒有 IDE 集成,並且在 Windows 上需要一個像樣的 shell。
因此,我將 IntelliJ 用於我的 Android 項目,以下解決了 IDE 中的問題:
只是因為它可能會節省我浪費的幾個小時... IntelliJ -> Preferences -> Build, Execution, Deployment -> Build tools -> Maven -> Gradle
並將Gradle JVM設置為 1.8 確保您還安裝了 JDK 8...
注意:該項目從命令行編譯得很好
對於 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)。
如果你使用 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 操作系統將是類似的。
有一個非常簡單的方法。 您可以嘗試以下解決方案。
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
我正在使用 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
如果您只想設置一次以運行特定命令:
JAVA_HOME=/usr/lib/jvm/java-11-oracle/ gw build
由於這個答案,我能夠確定我的問題是 gradle 選擇了錯誤的 JDK,即使 JAVA_HOME 設置正確也是如此。
我原來的評論:
我的操作系統是 Linux 並且我的 JAVA_HOME 指向正確的路徑。 我什至用這個命令 gradle build -Dorg.gradle.java.home=$JAVA_HOME 來證明我的觀點。 我已經在 Ubuntu 中使用 snap 安裝了 gradle,我猜它正在使用一些捆綁的 JDK。
我的解決方案:
我已經使用 snap 刪除了 gradle,然后我通過下載他們的二進制文件並將其放入 PATH 中手動安裝了 gradle。
我的結論是 Ubuntu 上的 gradle snap 安裝與一些較舊的 JDK 捆綁在一起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.