Bagaimana saya memberi tahu Gradle untuk menggunakan versi JDK tertentu?

284

Saya tidak tahu untuk membuat ini berfungsi.

Skenario:

  • Saya memiliki aplikasi yang dibangun dengan gradle
  • Aplikasi ini menggunakan JavaFX

Apa yang saya inginkan

  • Gunakan variabel (ditentukan per mesin pengembang) yang menunjuk ke instalasi JDK yang akan digunakan untuk membangun seluruh aplikasi / tes / ...

Saya berpikir tentang memiliki gradle.propertiesfile, mendefinisikan variabel. Sesuatu seperti

JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>

Apa yang tidak saya inginkan

  • arahkan JAVA_HOMEke JDK yang diinginkan

Saya bisa hidup dengan banyak saran:

  • solusi yang mendefinisikan variabel lingkungan sistem yang dapat saya periksa di skrip build.gradle saya
  • variabel yang didefinisikan dalam gradle.properties
  • meng-override variabel JAVA_HOME hanya untuk konteks build (sesuatu seperti use JAVA_HOME=<my special JDK path defined somewhere else defined>)
  • sesuatu yang lain yang tidak saya pikirkan

Pertanyaan:

  • Bagaimana cara mengirim variabel (bagaimana pernah didefinisikan, sebagai variabel dalam gradle.properties, variabel lingkungan sistem, ...) ke proses pembuatan?

Saya memiliki lebih dari satu JDK7 yang tersedia dan perlu menunjuk ke versi khusus (versi JDK_u minimum).

Setiap jawaban dihargai dan saya berterima kasih atas setiap petunjuk ke arah yang benar.

menggertak
sumber
6
Sudahkah Anda mencoba pengaturan org.gradle.java.homedi gradle.propertiesfile? tautan
Ray Stojonic
di eclipse Anda dapat membuat "file konfigurasi produk" di proyek Anda dan Anda dapat mengemas jdk dengan produk Anda. Tidak perlu menentukan variabel env.
mdanaci
3
@RayStojonic: Saya baru saja mencobanya, tetapi gradle masih menggunakan JAVA_HOME JDK untuk membangun :(
bully
@mdanaci: Saya benar-benar berharap saya bisa menghindari ini karena saya jujur ​​tidak ingin mengambil JDK di bawah kontrol versi (yang akan menjadi konsekuensi jika saya akan menggunakan saran Anda) karena setiap pengembang harus dapat mengemas aplikasi. Plus, saya melihat masalah dengan server CI dengan cara ini. Terima kasih atas saran Anda :)
bully
3
Pada tahun lalu, org.gradle.java.homepengaturan hanya berlaku untuk gradle daemon, tampaknya ... Bagaimanapun, coba atur garpu ke true dan forkOptions. Dapat dieksekusi ke jdk yang ingin Anda gunakan: tautan
Ray Stojonic

Jawaban:

292

Dua arah

  1. Di gradle.propertiesdalam .gradledirektori di HOME_DIRECTORYset Andaorg.gradle.java.home=/path_to_jdk_directory

atau:

  1. Di Anda build.gradle

    compileJava.options.fork = true
    compileJava.options.forkOptions.executable = /path_to_javac
Zero Pertama
sumber
23
The gradle.propertiesdapat didefinisikan pada tingkat proyek juga, lihat gradle.org/docs/current/userguide/build_environment.html
Paolo Fulgoni
143
Jika Anda menjalankan menggunakan pembungkus gradle, Anda juga dapat melakukannya ./gradlew -Dorg.gradle.java.home=/path_to_jdk_directory. Bagus jika Anda tidak ingin menyentuh gradle.properties.
david.schreiber
26
Pertanyaannya adalah bagaimana mengatur VERSION, bukan JDK PATH, bukan?
Dims
39
Dengan cara ini saya tidak dapat berbagi proyek dengan pengembang lain, yang memiliki java di jalur yang berbeda.
Dims
10
Ada perbedaan antara opsi 1 dan 2 yang harus diklarifikasi: Dalam opsi 1 kita mengatur JVM agar gradle berjalan di bawah yang juga akan digunakan untuk menjalankan tugas kompiler (perhatikan bahwa javac sendiri adalah aplikasi java), sementara di opsi 2 kita hanya mengatur javac untuk muncul di JVM sendiri. Jika karena alasan apa pun kita membutuhkan JVM khusus untuk gradle (mis. Plugin gradle yang diberikan dikompilasi untuk Java 8), maka kita akan dipaksa untuk menggunakan JVM terpisah untuk proses kompilasi.
Basel Shishani
147

Jika Anda menambahkan JDK_PATH di gradle.properties bangunan Anda menjadi bergantung pada jalur tertentu. Sebaliknya Jalankan tugas gradle dengan mengikuti parametemer baris perintah berikut

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

Dengan cara ini bangunan Anda tidak bergantung pada beberapa jalur konkret.

mirmdasif
sumber
3
Di Eclipse (Neon, 4.6) Anda juga dapat mengatur Java Home dalam konfigurasi build Gradle (lihat tab "Java Home"). Ini adalah pekerjaan yang membosankan jika Anda memiliki 20+ pekerjaan bangunan ... Saya pikir Gradle benar-benar perlu memilih direktori Java Home dari konfigurasi sistem!
Markus L
1
Ini adalah poin yang adil. Saya memiliki tautan lunak /usr/lib/java/jdk/homeyang menunjuk ke versi saat ini yang diinstal. Tentu saja ketika Anda menginginkan versi tertentu (mis. U51) maka Anda harus spesifik tentang path. Juga beberapa alat ingin kick-off gradle tampaknya tidak mengatur JDK di lingkungan yang mereka berikan gradle. Dan saya tidak pernah menetapkan JDK sebagai JAVA_HOME saat ini kecuali itu adalah sesi pengembangan.
akan
6
Perhatikan bahwa JDK_PATH tidak dapat memiliki spasi di Windows, meskipun dalam tanda kutip: Anda telah mengubah "Program Files" menjadi PROGRA~1(semua huruf besar) atau apa pun yang dikatakan DIR / X kepada Anda.
Noumenon
2
Jika Anda menggunakan gradle wrapper, jalankan perintah seperti ini ./gradlew build -Dorg.gradle.java.home = / JDK_PATH Ganti JDK_PATH dengan lokasi jdk di lingkungan Anda seperti '/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".Saya menentukan JAVA_HOME sebelum panggilan tingkat lanjut untuk memperbaikinya. (mis. env JAVA_HOME=/path/to/java gradlew war --stacktrace)
TekiusFanatikus
110

Untuk orang-orang yang berakhir di sini ketika mencari Gradle yang setara dengan properti Maven maven.compiler.source(atau <source>1.8</source>):

Di build.gradle Anda dapat mencapainya dengan

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

Lihat dokumentasi Gradle tentang ini .

Geert
sumber
1
Ini bekerja untuk saya, tetapi saya harus mengubah "apply plugin 'java'" menjadi "apply plugin: 'java'" (perhatikan titik dua)
will.fiset
9
@morgwai - kecuali bahwa ini bukan jawaban untuk pertanyaan, yang secara eksplisit bertanya "Apa yang saya inginkan [adalah mengatur] variabel (ditentukan per mesin pengembang) yang menunjuk ke instalasi JDK yang akan digunakan untuk membangun seluruh aplikasi ". Jawaban yang dipilih benar; jawaban ini untuk pertanyaan yang sama sekali berbeda.
Jules
Ini diabaikan oleh alat-alat seperti tugas Javadoc (yang mencoba untuk menghasilkan javadoc sesuai dengan Java 9 dengan modul pada proyek saya yang ditentukan untuk menggunakan Java 8)
CLOVIS
20

Jika Anda mengeksekusi menggunakan gradle wrapper, Anda dapat menjalankan perintah dengan path JDK seperti berikut

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

Vittal Pai
sumber
5

Jika Anda menggunakan linux dan gradle wrapper, Anda dapat menggunakan solusi berikut.

Tambahkan path ke file local.properties:

javaHome=<path to JDK>

Tambahkan ke file skrip gradlew Anda:

DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
source $DIR/local.properties 2>/dev/null

if ! [ -z "$javaHome" ]
then
  JAVA_HOME=$javaHome
fi

Dalam solusi ini, setiap pengembang dapat menetapkan jalur JDK sendiri. File local.propertiestidak boleh dimasukkan dalam sistem kontrol versi.

sylwano
sumber
5

Saya menambahkan baris ini dalam file GRADLE_HOME / bin / gradle saya - export JAVA_HOME=/path/to/java/version

Manoj
sumber
4

Ada satu opsi lagi untuk diikuti. Dalam tugas gradle Anda, Anda dapat mengatur jalur jdk yang Anda inginkan. (Saya tahu ini sudah lama sejak pertanyaan itu diposting. Jawaban ini dapat membantu seseorang.)

Klik kanan pada penyebaran atau tugas lain dan pilih "Open Gradle Run Configuration ..."

masukkan deskripsi gambar di sini

Lalu navigasikan ke "Java Home" dan rekatkan jalur java yang Anda inginkan.

masukkan deskripsi gambar di sini

Harap dicatat bahwa, bin akan ditambahkan oleh tugas gradle itu sendiri. Jadi jangan tambahkan "bin" ke path.

Kiran
sumber
Jangan melihat tugas gradle
Paul McCarthy
1

Untuk windows jalankan tugas gradle dengan parameter path jdk 11 dalam tanda kutip

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

Seperti yang terlihat di Gradle (Eclipse plugin)

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

Gradle menggunakan JDK mana pun yang ditemukannya di jalur Anda (untuk memeriksa, gunakan java-versi). Atau, Anda dapat mengatur variabel lingkungan JAVA_HOME untuk menunjuk ke direktori instalasi JDK yang diinginkan.


Jika Anda menggunakan plugin Eclipse atau Enide Studio 2014 ini , JAVA_HOME alternatif untuk digunakan (diatur dalam Preferensi) akan ada di versi 0.15, lihat http://www.nodeclipse.org/history

Paul Verest
sumber
1
Hai Paul, sebenarnya, inilah masalah saya. Saya ingin mendefinisikan JDK yang berbeda untuk tugas membangun-tingkat daripada yang ditentukan dalam JAVA_HOME. Padahal, ada baiknya mengetahui bahwa akan ada entri di plugin gerhana untuk ini :)
bully
Eclipse Standar memungkinkan untuk mendefinisikan variabel lingkungan per konfigurasi peluncuran. Tapi bukan itu yang kami coba dengan gradle. Buka masalah jika Anda menjelajahi pertanyaan ini lebih lanjut github.com/Nodeclipse/nodeclipse-1/issues
Paul Verest
0

Saya menggunakan Gradle 4.2. Default JDK adalah Java 9. Pada awal Java 9, Gradle 4.2 berjalan pada JDK 8 dengan benar (bukan JDK 9).

Saya mengatur JDK secara manual seperti ini, dalam file %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
Apakah Nhu Vy
sumber
0

Jika Anda menggunakan JDK 9+, Anda dapat melakukan ini:

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

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

Anda juga dapat melihat masalah terkait berikut ini:

Rosberg Linhares
sumber
0

Android Studio

File> Struktur Proyek> Lokasi SDK> Lokasi JDK>

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

GL

Instal JDK

Braian Coronel
sumber
0

Jika Anda menggunakan Kotlin DSL, maka build.gradle.ktstambahkan:

tasks.withType<JavaCompile> {
    options.isFork = true
    options.forkOptions.javaHome = File("C:\\bin\\jdk-13.0.1\\")
}

Tentu saja, saya berasumsi bahwa Anda memiliki OS Windows dan javackompiler sedang berjalan C:\bin\jdk-13.0.1\bin\javac. Untuk Linux OS akan sama.

Schakal
sumber
-1

Jika Anda hanya ingin mengaturnya sekali untuk menjalankan perintah tertentu:

JAVA_HOME=/usr/lib/jvm/java-11-oracle/ gw build
JasonBodnar
sumber