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