Làm cách nào để tôi bảo Gradle sử dụng phiên bản JDK cụ thể?


284

Tôi không thể tìm ra để làm việc này.

Kịch bản:

  • Tôi có một ứng dụng được xây dựng với gradle
  • Ứng dụng sử dụng JavaFX

Những gì tôi muốn

  • Sử dụng một biến (được xác định cho mỗi máy của nhà phát triển) để chỉ cài đặt JDK sẽ được sử dụng để xây dựng toàn bộ ứng dụng / thử nghiệm / ...

Tôi nghĩ về việc có các gradle.propertiestập tin, xác định các biến. Cái gì đó như

JAVA_HOME_FOR_MY_PROJECT=<path to my desired JDK>

Những gì tôi không muốn

  • trỏ JAVA_HOMEđến JDK mong muốn

Tôi có thể sống với nhiều gợi ý:

  • một giải pháp xác định biến môi trường hệ thống mà tôi có thể kiểm tra trong tập lệnh build.gradle của mình
  • một biến được định nghĩa trong gradle.properies
  • ghi đè biến JAVA_HOME chỉ cho bối cảnh xây dựng (đại loại như use JAVA_HOME=<my special JDK path defined somewhere else defined>)
  • một cái gì đó khác tôi đã không nghĩ về

Câu hỏi:

  • Làm cách nào để nối một biến (bao giờ được xác định, là biến trong gradle.propertiesbiến môi trường hệ thống, ...) cho quá trình xây dựng?

Tôi có sẵn nhiều hơn một JDK7 và cần trỏ đến một phiên bản đặc biệt (phiên bản JDK_u tối thiểu).

Bất kỳ câu trả lời nào đều được đánh giá cao và tôi rất biết ơn vì mọi gợi ý đều đi đúng hướng.


6
Bạn đã thử thiết lập org.gradle.java.hometrong gradle.propertiestập tin? liên kết
Ray Stojonic

trong nhật thực, bạn có thể tạo "tệp cấu hình sản phẩm" trong dự án của mình và bạn có thể đóng gói jdk với sản phẩm của mình. Không cần chỉ định biến env.
mdanaci

3
@RayStojonic: Tôi mới dùng thử, nhưng gradle vẫn sử dụng JAVA_HOME JDK để xây dựng :(
bắt nạt

@mdanaci: Tôi thực sự hy vọng tôi có thể tránh điều này bởi vì tôi thực sự không muốn sử dụng JDK dưới sự kiểm soát phiên bản (đó sẽ là hậu quả nếu tôi sử dụng đề xuất của bạn) vì bất kỳ nhà phát triển nào cũng có thể đóng gói ứng dụng. Thêm vào đó, tôi thấy vấn đề với máy chủ CI theo cách này. Dù sao cũng cảm ơn lời đề nghị của bạn :)
bắt nạt

3
Kể từ một năm trước, org.gradle.java.homecài đặt chỉ áp dụng cho lớp daemon, rõ ràng ... Ở bất kỳ giá nào, hãy thử đặt fork thành true và forkOptions.executable cho jdk bạn muốn sử dụng: link
Ray Stojonic

Câu trả lời:


292

Hai lối

  1. Trong gradle.propertiestrong .gradlethư mục trong bạn HOME_DIRECTORYthiết lậporg.gradle.java.home=/path_to_jdk_directory

hoặc là:

  1. Trong bạn build.gradle

    compileJava.options.fork = true
    compileJava.options.forkOptions.executable = /path_to_javac

23
Điều này gradle.propertiescũng có thể được xác định ở cấp dự án, xem gradle.org/docs/civerse/userguide/build_en môi.html
Paolo Fulgoni

143
Nếu bạn đang thực hiện bằng cách sử dụng lớp bọc, bạn cũng có thể làm như thế ./gradlew -Dorg.gradle.java.home=/path_to_jdk_directory. Tốt nếu bạn không muốn chạm vào gradle.properties.
david.schreiber

26
Câu hỏi là làm thế nào để thiết lập VERSION, không phải JDK PATH, phải không?
Ngày

38
Bằng cách này, tôi không thể chia sẻ dự án với các nhà phát triển khác, những người có java theo các đường dẫn khác nhau.
Ngày

10
Có một sự khác biệt giữa các tùy chọn 1 và 2 cần được làm rõ: Trong tùy chọn 1, chúng tôi đang thiết lập JVM cho chính lớp để chạy theo đó cũng sẽ được sử dụng để chạy tác vụ biên dịch (lưu ý rằng chính javac là một ứng dụng java), trong khi tùy chọn 2 chúng ta chỉ thiết lập javac được sinh ra trong JVM của riêng nó. Nếu vì bất kỳ lý do gì, chúng ta cần một JVM cụ thể cho lớp (ví dụ, một trình cắm lớp đã cho được biên dịch cho Java 8), thì chúng ta sẽ buộc phải sử dụng một JVM riêng cho quy trình biên dịch.
Basel Shishani

147

Nếu bạn thêm JDK_PATH trong gradle.properations, bản dựng của bạn trở nên phụ thuộc vào đường dẫn cụ thể đó. Thay vào đó, hãy chạy tác vụ gradle với tham số dòng lệnh sau

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

Cách này xây dựng của bạn không phụ thuộc vào một số con đường cụ thể.


3
Trong Eclipse (Neon, 4.6), bạn cũng có thể đặt Trang chủ Java trong cấu hình bản dựng Gradle (xem tab "Trang chủ Java"). Đây là một công việc hơi tẻ nhạt nếu bạn có hơn 20 công việc xây dựng ... Tôi nghĩ Gradle thực sự cần chọn thư mục Java Home từ cấu hình của hệ thống!
Markus L

1
Đây là một điểm công bằng. Tôi có một liên kết mềm được gọi là /usr/lib/java/jdk/hometrỏ đến phiên bản hiện tại được cài đặt. Tất nhiên khi bạn muốn có một phiên bản cụ thể (ví dụ u51) thì bạn cần phải cụ thể về đường dẫn. Ngoài ra, một số công cụ muốn khởi động gradle dường như không đặt JDK trong môi trường mà chúng đưa ra. Và tôi vì một người không bao giờ đặt JDK là JAVA_HOME hiện tại trừ khi đó là phiên phát triển.
sẽ

6
Lưu ý rằng JDK_PATH không thể có khoảng trắng trên Windows, ngay cả khi nó được trích dẫn: bạn đã thay đổi "Tệp chương trình" thành PROGRA~1(tất cả các chữ hoa) hoặc bất cứ điều gì khác mà DIR / X nói với bạn.
Noumenon

2
Nếu bạn đang sử dụng trình bao bọc lớp, hãy gọi lệnh như thế này ./gradlew build -Dorg.gradle.java.home = / JDK_PATH Thay thế JDK_PATH bằng vị trí jdk của bạn trong môi trường của bạn như '/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".Tôi đã chỉ định JAVA_HOME trước khi gọi gradlew để sửa lỗi này. (tức là. env JAVA_HOME=/path/to/java gradlew war --stacktrace)
TekiusFanatikus

110

Đối với những người kết thúc tại đây khi tìm kiếm Gradle tương đương với thuộc tính Maven maven.compiler.source(hoặc<source>1.8</source> ):

Trong build.gradle bạn có thể đạt được điều này với

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

Xem tài liệu Gradle về điều này .


1
Điều này hiệu quả với tôi nhưng tôi đã phải thay đổi "áp dụng plugin 'java'" thành "áp dụng plugin: 'java'" (chú ý dấu hai chấm)
will.fiset

9
@morgwai - ngoại trừ việc đây không phải là câu trả lời cho câu hỏi, câu hỏi rõ ràng là "Điều tôi muốn [là đặt] một biến (được xác định cho mỗi máy phát triển) chỉ ra một bản cài đặt JDK sẽ được sử dụng để xây dựng toàn bộ ứng dụng ". Các câu trả lời nâng cao là chính xác; Câu trả lời này là cho một câu hỏi hoàn toàn khác.
Jules

Điều này bị bỏ qua bởi các công cụ như tác vụ Javadoc (cố gắng tạo javadoc theo Java 9 với các mô-đun trong dự án của tôi được chỉ định sử dụng Java 8)
CLOVIS

20

Nếu bạn đang thực thi bằng cách sử dụng trình bao bọc lớp, bạn có thể chạy lệnh với đường dẫn JDK như sau

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


5

Nếu bạn đang sử dụng trình bao bọc linux và gradle, bạn có thể sử dụng giải pháp sau đây.

Thêm đường dẫn đến tệp local.properIES:

javaHome=<path to JDK>

Thêm vào tập tin tập lệnh gradlew của bạn:

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

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

Trong giải pháp này, mỗi nhà phát triển có thể thiết lập đường dẫn JDK của riêng mình. Tập tin local.propertieskhông nên được bao gồm trong hệ thống kiểm soát phiên bản.


5

Tôi đã thêm dòng này trong tệp GRADLE_HOME / bin / gradle của mình - export JAVA_HOME=/path/to/java/version


4

Có một lựa chọn nữa để làm theo. Trong các tác vụ lớp, bạn có thể đặt đường dẫn jdk mong muốn của mình. (Tôi biết đây là một thời gian kể từ khi câu hỏi được đăng. Câu trả lời này có thể giúp ai đó.)

Nhấp chuột phải vào triển khai hoặc bất kỳ tác vụ nào khác và chọn "Mở cấu hình chạy lớp ..."

nhập mô tả hình ảnh ở đây

Sau đó điều hướng đến "Trang chủ Java" và dán đường dẫn java mong muốn của bạn.

nhập mô tả hình ảnh ở đây

Xin lưu ý rằng, bin sẽ được thêm bởi chính nhiệm vụ lớp. Vì vậy, đừng thêm "thùng" vào đường dẫn.


Đừng xem các nhiệm vụ cấp lớp
Paul McCarthy


1

Đối với các cửa sổ chạy tác vụ gradle với tham số đường dẫn jdk 11 trong dấu ngoặc kép

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

0

Như đã thấy trong Gradle (plugin Eclipse)

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

Gradle sử dụng bất kỳ JDK nào nó tìm thấy trong đường dẫn của bạn (để kiểm tra, sử dụng java -version). Ngoài ra, bạn có thể đặt biến môi trường JAVA_HOME để trỏ đến thư mục cài đặt của JDK mong muốn.


Nếu bạn đang sử dụng plugin Eclipse này hoặc Enide Studio 2014 , JAVA_HOME thay thế để sử dụng (được đặt trong Tùy chọn) sẽ ở phiên bản 0.15, xem http://www.nodeclipse.org/history


1
Xin chào Paul, thực sự, chính xác đây là vấn đề của tôi. Tôi muốn định nghĩa một JDK khác cho các nhiệm vụ xây dựng lớp hơn là được xác định trong JAVA_HOME. Mặc dù vậy, thật tốt khi biết rằng sẽ có một mục trong plugin nhật thực cho việc này :)
bắt nạt

Eclipse tiêu chuẩn cho phép xác định các biến môi trường trên mỗi cấu hình khởi chạy. Nhưng đó không phải là những gì chúng tôi cố gắng với gradle. Mở một vấn đề nếu bạn khám phá thêm câu hỏi này github.com/Nodeclipse/nodeclipse-1/issues
Paul Verest

0

Tôi đang sử dụng Lớp 4.2. JDK mặc định là Java 9. Vào đầu ngày của Java 9, Gradle 4.2 chạy trên JDK 8 một cách chính xác (không phải JDK 9).

Tôi đặt JDK theo cách thủ công như thế này, trong tệp %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

Nếu bạn đang sử dụng JDK 9+, bạn có thể làm điều này:

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

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

Bạn cũng có thể thấy các vấn đề liên quan sau đây:



0

Nếu bạn đang sử dụng DSL DSL, hãy build.gradle.ktsthêm:

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

Tất nhiên, tôi giả sử rằng bạn có hệ điều hành Windows và javactrình biên dịch đang trong đường dẫn C:\bin\jdk-13.0.1\bin\javac. Đối với hệ điều hành Linux sẽ tương tự.


-1

Nếu bạn chỉ muốn đặt nó một lần để chạy một lệnh cụ thể:

JAVA_HOME=/usr/lib/jvm/java-11-oracle/ gw build
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.