ฉันจะบอก Gradle ให้ใช้งาน JDK รุ่นใดรุ่นหนึ่งได้อย่างไร


284

ฉันไม่สามารถคิดได้ว่าจะทำงานนี้ได้อย่างไร

สถานการณ์:

  • ฉันมีแอปพลิเคชันที่สร้างขึ้นมา
  • แอปพลิเคชันใช้ 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 รุ่น)

คำตอบใด ๆ ที่ชื่นชมและฉันขอบคุณสำหรับคำแนะนำทุกทิศทางที่ถูกต้อง


6
คุณลองตั้งค่าorg.gradle.java.homeในgradle.propertiesไฟล์แล้วหรือยัง? ลิงก์
Ray Stojonic

ใน eclipse คุณสามารถสร้าง "file config ผลิตภัณฑ์" ในโครงการของคุณและคุณสามารถแพ็ค jdk กับผลิตภัณฑ์ของคุณ ไม่จำเป็นต้องระบุตัวแปร env
mdanaci

3
@ RayStojonic: ฉันเพิ่งลองดู แต่ gradle ยังคงใช้ JAVA_HOME JDK สำหรับการสร้าง :(
พาล

@ mdanaci: ฉันหวังว่าฉันจะหลีกเลี่ยงสิ่งนี้ได้เพราะฉันไม่ต้องการใช้ JDK ภายใต้การควบคุมเวอร์ชัน (ซึ่งจะเป็นผลถ้าฉันจะใช้ข้อเสนอแนะของคุณ) เนื่องจากนักพัฒนาใด ๆ จะต้องสามารถจัดเก็บแอปพลิเคชันได้ นอกจากนี้ฉันเห็นปัญหากับเซิร์ฟเวอร์ CI ด้วยวิธีนี้ ขอบคุณสำหรับคำแนะนำของคุณแล้วล่ะค่ะ :)
พาล

3
เมื่อปีที่ผ่านมาการorg.gradle.java.homeตั้งค่าจะใช้กับ gradle daemon เท่านั้น ... ในทุก ๆ ทางลองตั้งค่า fork เป็น true และ forkOptions.executable jdk ที่คุณต้องการใช้: link
Ray Stojonic

คำตอบ:


292

สองทาง

  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
    

23
gradle.propertiesสามารถกำหนดได้ในระดับโครงการเกินไปดูgradle.org/docs/current/userguide/build_environment.html
เปาโล Fulgoni

143
หากคุณกำลังใช้งาน wrapper gradle คุณก็สามารถทำได้เช่น ./gradlew -Dorg.gradle.java.home=/path_to_jdk_directoryกัน gradle.propertiesที่ดีถ้าคุณไม่ต้องการที่จะสัมผัส
david.schreiber

26
คำถามคือวิธีการตั้งค่า VERSION ไม่ใช่ JDK PATH ใช่ไหม
Dims

40
วิธีนี้ฉันไม่สามารถแชร์โปรเจ็กต์กับนักพัฒนาคนอื่นที่มีจาวาในพา ธ ที่ต่างกัน
Dims

10
มีความแตกต่างระหว่างตัวเลือกที่ 1 และ 2 ที่ควรจะชี้แจง: ในตัวเลือกที่ 1 เรากำลังตั้งค่า JVM สำหรับการไล่ระดับตัวเองเพื่อให้ทำงานภายใต้ซึ่งจะใช้ในการเรียกใช้งานคอมไพเลอร์ (สังเกตว่า ตัวเลือกที่ 2 เราเพิ่งตั้งค่า javac ให้วางไข่ใน JVM ของตัวเอง หากด้วยเหตุผลใดก็ตามที่เราต้องการ JVM เฉพาะสำหรับการไล่ระดับสี (เช่นปลั๊กอินการรวบรวมที่กำหนดจะถูกรวบรวมสำหรับการพูด Java 8) จากนั้นเราจะถูกบังคับให้หันไปใช้การแยก JVM สำหรับกระบวนการรวบรวม
Basel Shishani

147

ถ้าคุณเพิ่ม JDK_PATH ในgradle.properties งานสร้างของคุณจะขึ้นอยู่กับพา ธ นั้น รันภารกิจการไล่ระดับสีแทนด้วยพารามิเตอร์บรรทัดคำสั่งต่อไปนี้แทน

gradle build -Dorg.gradle.java.home=/JDK_PATH

วิธีนี้งานสร้างของคุณไม่ได้ขึ้นอยู่กับเส้นทางคอนกรีต


3
ใน Eclipse (Neon, 4.6) คุณยังสามารถตั้งค่า Java Home ภายในคอนฟิกูเรชัน Gradle build (ดูแท็บ "Java Home") นี่เป็นงานที่ค่อนข้างน่าเบื่อถ้าคุณมีงานสร้างมากกว่า 20 งาน ... ฉันคิดว่า Gradle จำเป็นต้องเลือกไดเรกทอรี Java Home จากการกำหนดค่าของระบบ!
Markus L

1
นี่คือจุดที่เป็นธรรม. ฉันมีซอฟต์ลิงค์ที่เรียก/usr/lib/java/jdk/homeว่าชี้ไปที่เวอร์ชันปัจจุบันติดตั้ง แน่นอนว่าเมื่อคุณต้องการรุ่นที่เฉพาะเจาะจง (เช่น u51) คุณต้องระบุเส้นทางที่เฉพาะเจาะจง เครื่องมือบางอย่างที่ต้องการจะไล่ระดับสีก็ไม่ได้ตั้งค่า JDK ในสภาพแวดล้อมที่พวกเขาให้เกรด และฉันหนึ่งไม่เคยตั้ง JDK เป็น JAVA_HOME ปัจจุบันเว้นแต่จะเป็นเซสชั่นการพัฒนา
จะ

6
โปรดทราบว่า JDK_PATH ไม่สามารถมีช่องว่างบน Windows แม้ว่าจะอยู่ในเครื่องหมายคำพูด: คุณได้เปลี่ยน "Program Files" เป็นPROGRA~1(ตัวพิมพ์ใหญ่ทั้งหมด) หรือสิ่งอื่น DIR / X จะบอกคุณ
Noumenon

2
ถ้าคุณใช้ wrapper gradle เรียกใช้คำสั่งเช่นนี้. /gradlew build -Dorg.gradle.java.home = / JDK_PATH แทนที่ JDK_PATH ด้วยตำแหน่ง jdk ของคุณในสภาพแวดล้อมของคุณเช่น '/opt/java/jdk1.7.0_79/bin/'
mirmdasif

3
"... gradle itself (either standalone distribution or wrapper) uses JDK from JAVA_HOME environment variable or (if it is not set) from PATH".ฉันระบุ JAVA_HOME ก่อนที่จะโทรหา gradlew เพื่อแก้ไขปัญหานี้ (เช่น. env JAVA_HOME=/path/to/java gradlew war --stacktrace)
TekiusFanatikus

110

สำหรับคนที่มาที่นี่เมื่อค้นหา Gradle ที่เทียบเท่ากับคุณสมบัติ Maven maven.compiler.source(หรือ<source>1.8</source>):

ใน build.gradle คุณสามารถทำสิ่งนี้ได้ด้วย

apply plugin: 'java'
sourceCompatibility = 1.8
targetCompatibility = 1.8

ดูเอกสาร Gradle เกี่ยวกับเรื่องนี้


1
สิ่งนี้ใช้ได้สำหรับฉัน แต่ฉันต้องเปลี่ยน "ใช้ปลั๊กอิน 'java'" เป็น "ใช้ปลั๊กอิน: 'java'" (สังเกตโคลอน)
will.fiset

10
@morgwai - ยกเว้นว่านี่ไม่ใช่คำตอบสำหรับคำถามซึ่งถามอย่างชัดเจนว่า "สิ่งที่ฉันต้องการ [คือการตั้งค่า] ตัวแปร (กำหนดต่อเครื่องผู้พัฒนา) ซึ่งชี้ไปที่การติดตั้ง JDK ซึ่งจะใช้สำหรับการสร้าง แอปพลิเคชันทั้งหมด ". คำตอบที่ upvote นั้นถูกต้อง; คำตอบนี้เป็นคำถามที่แตกต่างอย่างสิ้นเชิง
จูลส์

1
สิ่งนี้ถูกละเว้นโดยเครื่องมือเช่นงาน Javadoc (ซึ่งพยายามสร้าง javadoc ตาม Java 9 ที่มีโมดูลในโครงการของฉันที่ระบุให้ใช้ Java 8)
CLOVIS

20

หากคุณกำลังดำเนินการโดยใช้ gradle wrapper คุณสามารถเรียกใช้คำสั่งด้วยพา ธ JDK ดังนี้

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


5

หากคุณใช้ linux และ gradle wrapper คุณสามารถใช้วิธีแก้ไขปัญหาต่อไปนี้

เพิ่มพา ธ ไปยังไฟล์ 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ไม่ควรรวมไฟล์ไว้ในระบบควบคุมเวอร์ชัน



4

มีอีกหนึ่งตัวเลือกในการติดตาม ในงานการไล่ระดับสีของคุณคุณสามารถตั้งค่าเส้นทาง jdk ที่คุณต้องการ (ฉันรู้ว่านี่เป็นเวลาไม่นานเนื่องจากคำถามถูกโพสต์คำตอบนี้สามารถช่วยคนได้)

คลิกขวาที่การปรับใช้หรืองานอื่น ๆ แล้วเลือก "เปิดการกำหนดค่าการไล่ระดับแบบเปิด ... "

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นไปที่ "Java Home" และวางเส้นทาง java ที่คุณต้องการ

ป้อนคำอธิบายรูปภาพที่นี่

โปรดทราบว่า bin จะถูกเพิ่มโดยงาน gradle เอง ดังนั้นอย่าเพิ่ม "ถังขยะ" ลงในเส้นทาง


ไม่เห็นงานการทำสีซีดจาง
Paul McCarthy


1

สำหรับ windows รันงาน gradle ด้วยพารามิเตอร์พา ธ jdk 11 ในเครื่องหมายคำพูด

gradlew clean build -Dorg.gradle.java.home="c:/Program Files/Java/jdk-11"

0

เท่าที่เห็นในGradle (ปลั๊กอิน Eclipse)

http://www.gradle.org/get-started

Gradle ใช้ JDK ใดก็ตามที่พบในพา ธ ของคุณ (เพื่อตรวจสอบให้ใช้ java -version) หรือคุณสามารถตั้งค่าตัวแปรสภาพแวดล้อม JAVA_HOME ให้ชี้ไปที่ไดเร็กทอรีการติดตั้งของ JDK ที่ต้องการ


หากคุณกำลังใช้ปลั๊กอิน Eclipse หรือEnide Studio 2014ทางเลือก JAVA_HOME ที่จะใช้ (ตั้งค่าในการตั้งค่า) จะเป็นเวอร์ชั่น 0.15 ดูที่http://www.nodeclipse.org/history


1
สวัสดี Paul จริง ๆ แล้วนี่คือปัญหาของฉัน ฉันต้องการกำหนด JDK ที่แตกต่างกันสำหรับงานสร้างระดับล่างกว่าที่กำหนดไว้ใน JAVA_HOME แต่ก็รู้ดีว่าจะมีรายการในอุปราคาปลั๊กอินสำหรับ :) นี้
คนพาล

Eclipse มาตรฐานอนุญาตให้กำหนดตัวแปรสภาพแวดล้อมต่อการกำหนดค่าการเปิด แต่นั่นไม่ใช่สิ่งที่เราลองทำกับ gradle เปิดปัญหาหากคุณสำรวจคำถามนี้เพิ่มเติมgithub.com/Nodeclipse/nodeclipse-1/issues
Paul Verest

0

ฉันใช้ Gradle 4.2 Default JDK คือ Java 9 ในช่วงต้นของ Java 9, Gradle 4.2 จะทำงานบน JDK 8 อย่างถูกต้อง (ไม่ใช่ JDK 9)

ฉันตั้งค่า JDK ด้วยตนเองเช่นนี้ในไฟล์%GRADLE_HOME%\bin\gradle.bat:

@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

0

หากคุณใช้ JDK 9+ คุณสามารถทำสิ่งนี้ได้:

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

tasks.withType<JavaCompile> {
    options.compilerArgs.addAll(arrayOf("--release", "8"))
}

คุณยังสามารถดูปัญหาที่เกี่ยวข้องดังต่อไปนี้:



0

หากคุณใช้ 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 OS จะเหมือนกัน


-1

หากคุณต้องการตั้งค่าเพียงครั้งเดียวเพื่อเรียกใช้คำสั่งเฉพาะ:

JAVA_HOME=/usr/lib/jvm/java-11-oracle/ gw build
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.