簡體   English   中英

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

[英]How do I tell Gradle to use specific JDK version?

我無法弄清楚如何讓這個工作。

設想:

  • 我有一個使用 gradle 構建的應用程序
  • 該應用程序使用 JavaFX

我想要的是

  • 使用一個變量(為每個開發人員機器定義),它指向一個 JDK 的安裝,它將用於構建整個應用程序/測試/...

我考慮過使用gradle.properties文件來定義變量。 就像是

JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>

我不想要的

  • 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 版本)。

任何答案都值得贊賞,我很感激每一個正確方向的提示。

兩種方式

  1. gradle.properties中的.gradle目錄中的HOME_DIRECTORY中設置org.gradle.java.home=/path_to_jdk_directory

或者:

  1. 在你的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"))
  }
}

如果您從Intellij IDE遇到此問題,請嘗試此選項

  1. 設置 Gradle JVM 主頁在此處輸入圖像描述

  2. 在 Project 模塊設置中設置 JDK 版本在此處輸入圖像描述

  3. 檢查模塊中的 JDK 版本在此處輸入圖像描述

如果您使用 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不應包含在版本控制系統中。

還有另一種選擇。 在 Eclipse 中可用的 gradle 任務中,您可以設置所需的 jdk 路徑。 (我知道問題發布已經有一段時間了。這個答案可以幫助別人。)

右鍵單擊部署或任何其他任務,然后選擇“打開 Gradle 運行配置...”

在此處輸入圖像描述

然后導航到“Java Home”並粘貼所需的 Java 路徑。

在此處輸入圖像描述

請注意,bin 將由 gradle 任務本身添加。 所以不要將“bin”添加到路徑中。

通過在項目級別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"))
}

您還可以看到以下相關問題:

我在我的 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 安裝后,這些步驟對我有用

Gradle(Eclipse 插件)中所示

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)。

安卓工作室

文件 > 項目結構 > SDK 位置 > JDK 位置 >

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

總帳

安裝 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 操作系統將是類似的。

有一個非常簡單的方法。 您可以嘗試以下解決方案。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM