То, что вы пытаетесь достичь, вполне возможно. Давайте шаг за шагом проверим, как это можно сделать . Прежде всего, мы даем указание Gradle компилировать все Java исходники с Java 8 совместимостью с исходным и целевым объектами и выполнять компиляцию с помощью Java 8 исполняемого файла, взятого из переменной среды JAVA8_HOME
:
plugins {
id 'java'
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType(JavaCompile) {
options.with {
fork = true
forkOptions.javaHome = System.env.'JAVA8_HOME' as File
}
}
Запуск сборки с переключателем --info
показывает, что исполняемый файл Java 8 действительно взят из переменной среды JAVA8_HOME
и применяется ко всем Java задачам компиляции.
> Task :compileJava
Compiling with Java command line compiler 'C:\dev\java\jdk-8\bin\javac.exe'.
> Task :compileTestJava
Compiling with Java command line compiler 'C:\dev\java\jdk-8\bin\javac.exe'.
Выполнение тестов с Java 11, взятый из переменной среды JAVA11_HOME
, работает аналогичным образом.
test {
executable = "${System.env.'JAVA11_HOME'}/bin/java"
}
Это снова приводит к следующему выводу:
> Task :test
Command: C:\dev\java\jdk-11/bin/java -Dorg.gradle.native=false ...
Подпроекты
Применение этого Конфигурация для всех подпроектов в многомодульном проекте проста. Ниже показан root проект build.gradle
, который применяет все правила только к тем подпроектам, к которым применен плагин Java.
plugins {
id 'base'
}
allprojects {
plugins.withId('java') {
repositories {
mavenCentral()
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType(JavaCompile) {
options.with {
fork = true
forkOptions.javaHome = System.env.'JAVA8_HOME' as File
}
}
test {
useJUnitPlatform()
executable = "${System.env.'JAVA11_HOME'}/bin/java"
}
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter-api:5.6.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.6.0")
}
}
}
Поскольку теперь вы зависите от настройки переменных среды, он имеет смысл проверить их перед началом сборки. Это можно сделать, проверив график задач, когда он будет готов:
gradle.taskGraph.whenReady { taskGraph ->
if (taskGraph.getAllTasks().find { it instanceof JavaCompile } != null
&& (System.env.'JAVA8_HOME' == null || System.env.'JAVA11_HOME' == null)) {
throw new GradleException("Please export 'JAVA8_HOME' and 'JAVA11_HOME'")
}
}
Jenkins
В Jenkins все, что вам нужно сделать, это убедиться, что вы установили необходимые JDK и экспортировали переменные среды должным образом. A Jenkinsfile может выглядеть следующим образом (возьмите его с крошкой соли, я еще не проверял):
pipeline {
tools {
jdk 'jdk-8'
jdk 'jdk-11'
}
environment {
JAVA8_HOME = "${tool 'jdk-8'}"
JAVA11_HOME = "${tool 'jdk-11'}"
}
stages {
stage('Build') {
steps {
checkout scm
sh "./gradlew --no-daemon --info --stacktrace clean build"
}
}
}
}