Java 在一个jenkins作业中编译并运行不同的jdk

Java 在一个jenkins作业中编译并运行不同的jdk,java,jenkins,gradle,Java,Jenkins,Gradle,我希望得到jenkins的工作,首先用Java8编译测试,然后用Java11运行测试。Gradle用于项目中,该项目有许多子项目。甚至可能吗? 我尝试了这种方法(实际上这是我想到的最好的方法) 放在mainbuild.gradle中,但我不确定这是否会影响其他目录中子项目/任务中的所有编译类型任务。 然后我用-Dorg.gradle.java.home=[java-11-home] 让我知道你的想法,谢谢 你想要达到的目标是完全可能的。让我们一步一步地检查如何做到这一点。首先,我们指示Gradl

我希望得到jenkins的工作,首先用Java8编译测试,然后用Java11运行测试。Gradle用于项目中,该项目有许多子项目。甚至可能吗?
我尝试了这种方法(实际上这是我想到的最好的方法)

放在main
build.gradle
中,但我不确定这是否会影响其他目录中子项目/任务中的所有编译类型任务。 然后我用
-Dorg.gradle.java.home=[java-11-home]


让我知道你的想法,谢谢

你想要达到的目标是完全可能的。让我们一步一步地检查如何做到这一点。首先,我们指示Gradle编译具有Java 8源和目标兼容性的所有Java源,并使用取自环境变量
JAVA8_HOME
的Java 8可执行文件执行编译:

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'.
使用取自环境变量
JAVA11_HOME
的JAVA11执行测试的方式类似

test {
   executable = "${System.env.'JAVA11_HOME'}/bin/java"
}
这将再次产生以下输出:

> Task :test
Command: C:\dev\java\jdk-11/bin/java -Dorg.gradle.native=false ...
子项目 将此配置应用于多模块项目中的所有子项目是很简单的。下面显示了根项目的
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中,您需要做的就是确保安装所需的JDK并正确导出环境变量。A可能看起来像这样(带点盐,我还没有测试过):


哇…看起来真是太棒了。我将尝试在我的案例中实施它。谢谢
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'")
    }
}
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"
            }
        }
    }
}