You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins不同JDK安装方式下JAVA_HOME配置异常求助

Jenkins Kubernetes代理JDK工具配置问题排查与解决

问题描述

在Jenkins v2.479.2版本中,使用Kubernetes代理执行声明式流水线时,JDK工具配置存在行为不一致问题:

  • 通过Eclipse Temurin插件安装的JDK,JAVA_HOME可正确指向JDK根目录,正常使用指定版本
  • 通过「解压GitHub下载的*.zip/*.tar.gz」方式安装的JDK,JAVA_HOME指向JDK安装的父目录(而非实际JDK根目录),导致系统默认使用代理自带的Java版本(而非指定的JDK21)

示例流水线

pipeline {
    agent {
        kubernetes {
            label "myagent"
        }
    }
    stages {
        stage("JDK tool bahaviour"){
            tools {
               jdk "jdk21"
            }
            steps{
                container("myagent") {
                    script {
                        println "JAVA_HOME is ${env.JAVA_HOME}"
                        sh 'java -version'
                        sh 'ls /home/jenkins/agent/tools/hudson.model.JDK/jdk21'
                    }
                }
            }
        }
   }
}

不同安装方式的日志对比

Eclipse Temurin插件安装JDK的执行日志

[Pipeline] {
[Pipeline] stage
[Pipeline] { (JDK tool bahaviour)
[Pipeline] tool
Installing Eclipse Temurin from /var/jenkins_home/caches/adoptopenjdk/LINUX/amd64/jdk-21.0.5+11.zip to /home/jenkins/agent/tools/hudson.model.JDK/jdk21 on myagent-x3000
[Pipeline] envVarsForTool
[Pipeline] withEnv
[Pipeline] {
[Pipeline] container
[Pipeline] {
[Pipeline] script
[Pipeline] {
[Pipeline] echo
JAVA_HOME is /home/jenkins/agent/tools/hudson.model.JDK/jdk21
[Pipeline] sh
+ java -version
openjdk version "21.0.5" 2024-10-15 LTS
OpenJDK Runtime Environment Temurin-21.0.5+11 (build 21.0.5+11-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.5+11 (build 21.0.5+11-LTS, mixed mode, sharing)
[Pipeline] sh
+ ls /home/jenkins/agent/tools/hudson.model.JDK/jdk21
NOTICE
bin
conf
include
jmods
legal
lib
man
release

该方式下JDK直接解压到指定目录,JAVA_HOME正确指向JDK根目录,可正常使用JDK21。

解压*.tar.gz方式安装JDK的执行日志

Unpacking https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz to /home/jenkins/agent/tools/hudson.model.JDK/jdk21 on myagent-83v0g
[Pipeline] envVarsForTool
[Pipeline] withEnv
[Pipeline] {
[Pipeline] container
[Pipeline] {
[Pipeline] script
[Pipeline] {
[Pipeline] echo
JAVA_HOME is /home/jenkins/agent/tools/hudson.model.JDK/jdk21
[Pipeline] sh
+ java -version
openjdk version "11.0.20" 2023-07-18
OpenJDK Runtime Environment (build 11.0.20+8-post-Ubuntu-1ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.20+8-post-Ubuntu-1ubuntu122.04, mixed mode, sharing)
[Pipeline] sh
+ ls /home/jenkins/agent/tools/hudson.model.JDK/jdk21
jdk-21.0.5+11

该方式下JDK解压后生成子目录jdk-21.0.5+11,但JAVA_HOME指向父目录,父目录下无bin文件夹,因此系统使用代理自带的JDK11。

已尝试方案

尝试在流水线中直接修改env.JAVA_HOME路径,但未生效,修改后的JAVA_HOME仍未变化,依旧使用JDK11。

对应的测试流水线:

pipeline {
    agent {
        kubernetes {
            label "myagent"
        }
    }
    stages {
        stage("JDK tool bahaviour"){
            tools {
               jdk "jdk21"
            }
            steps{
                container("myagent") {
                    script {
                        println "JAVA_HOME is ${env.JAVA_HOME}"
                        sh 'java -version'
                        env.JAVA_HOME='/home/jenkins/agent/tools/hudson.model.JDK/jdk21/jdk-21.0.5+11'
                        println "JAVA_HOME is ${env.JAVA_HOME}"
                        sh 'java -version'
                    }
                }
            }
        }
   }
}

执行日志:

Unpacking https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz to /home/jenkins/agent/tools/hudson.model.JDK/jdk21 on myagent-vfp6q
[Pipeline] envVarsForTool
[Pipeline] withEnv
[Pipeline] {
[Pipeline] container
[Pipeline] {
[Pipeline] script
[Pipeline] {
[Pipeline] echo
JAVA_HOME is /home/jenkins/agent/tools/hudson.model.JDK/jdk21
[Pipeline] sh
+ java -version
openjdk version "11.0.20" 2023-07-18
OpenJDK Runtime Environment (build 11.0.20+8-post-Ubuntu-1ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.20+8-post-Ubuntu-1ubuntu122.04, mixed mode, sharing)
[Pipeline] echo
JAVA_HOME is /home/jenkins/agent/tools/hudson.model.JDK/jdk21
[Pipeline] sh
+ java -version
openjdk version "11.0.20" 2023-07-18
OpenJDK Runtime Environment (build 11.0.20+8-post-Ubuntu-1ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.20+8-post-Ubuntu-1ubuntu122.04, mixed mode, sharing)

解决办法

1. 调整全局工具配置的解压子目录

在Jenkins全局工具配置中,针对手动下载的JDK配置,指定解压后的子目录路径,让Jenkins自动将JAVA_HOME指向正确的JDK根目录:

  • 路径:Manage Jenkins → Global Tool Configuration → JDK
  • 操作:选择对应的jdk21配置,勾选「Install automatically」,选择「Extract .zip/.tar.gz」方式,在「Subdirectory of extracted archive」输入框中填写jdk-21.0.5+11(与解压后的实际子目录名一致)。

2. 流水线中通过withEnv手动覆盖环境变量

若无法修改全局配置,可在流水线中使用withEnv块创建新的环境上下文,设置正确的JAVA_HOME并调整PATH优先级:

pipeline {
    agent {
        kubernetes {
            label "myagent"
        }
    }
    stages {
        stage("JDK tool bahaviour"){
            tools {
               jdk "jdk21"
            }
            steps{
                container("myagent") {
                    script {
                        def actualJdkHome = "${env.JAVA_HOME}/jdk-21.0.5+11"
                        withEnv(["JAVA_HOME=${actualJdkHome}", "PATH=${actualJdkHome}/bin:${env.PATH}"]) {
                            println "JAVA_HOME is ${env.JAVA_HOME}"
                            sh 'java -version'
                            sh 'ls ${JAVA_HOME}'
                        }
                    }
                }
            }
        }
   }
}

说明:withEnv会为块内的步骤单独设置环境变量,调整PATH顺序可确保系统优先使用指定JDK的java命令。

3. 使用预安装JDK的代理镜像(可选)

若频繁使用特定JDK版本,可制作包含JDK21的Kubernetes代理镜像,在镜像中直接配置好JAVA_HOME和PATH,避免每次流水线运行时动态安装JDK的开销。

内容的提问来源于stack exchange,提问作者jagr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:50:55