Jenkins Docker构建代理未安装Java 8却被检测到的原因排查
我在Ubuntu 18.04上运行的Jenkins服务器使用Java 11版本,可通过访问*/manage/systemInfo*查看:
java.specification.version 11
我基于Ubuntu 22.04实现了Docker构建代理,并指定安装Java 11版本:
# install java for Jenkins RUN apt-get install -qy openjdk-11-jdk
我发现所有构建节点都处于离线状态,查看日志后发现以下错误:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
根据Java类文件格式主版本号列表:类版本52对应Java 8,55对应Java 11。
进一步查看日志发现:
[11/14/22 18:35:38] [SSH] Checking java version of java
[11/14/22 18:35:38] [SSH] java -version returned 1.8.0_312.
因此我开始排查问题根源:
执行sudo docker container exec 20e1bfe2b182 ls -l /usr/bin/java返回:
/usr/bin/java -> /etc/alternatives/java
执行sudo docker container exec 20e1bfe2b182 ls -l /etc/alternatives/java返回:
/etc/alternatives/java -> /usr/lib/jvm/java-11-openjdk-amd64/bin/java
我还在Dockerfile中安装openjdk的步骤前加入RUN java -version,结果显示未安装Java。
在宿主机执行apt list --installed |grep jdk返回:
openjdk-11-jdk/bionic-updates,bionic-security,now 11.0.17+8-1ubuntu2~18.04 amd64 [installed]
openjdk-11-jdk-headless/bionic-updates,bionic-security,now 11.0.17+8-1ubuntu2~18.04 amd64 [installed]
openjdk-11-jre/bionic-updates,bionic-security,now 11.0.17+8-1ubuntu2~18.04 amd64 [installed]
openjdk-11-jre-headless/bionic-updates,bionic-security,now 11.0.17+8-1ubuntu2~18.04 amd64 [installed,automatic]
在Docker镜像中执行相同命令得到类似结果;从/目录执行find -name java* 2>/dev/null也未找到有效信息。
which java输出
宿主机:
$ which java
/usr/bin/java
$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Nov 24 2018 /usr/bin/java -> /etc/alternatives/java
$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 43 Jan 25 2022 /etc/alternatives/java -> /usr/lib/jvm/java-11-openjdk-amd64/bin/java
Docker容器:
$ sudo docker compose run man which java
/usr/bin/java
$ sudo docker compose run man ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Nov 14 20:28 /usr/bin/java -> /etc/alternatives/java
$ sudo docker compose run man ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 43 Nov 14 20:28 /etc/alternatives/java -> /usr/lib/jvm/java-11-openjdk-amd64/bin/java
echo $PATH输出
宿主机
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Docker容器
$ sudo docker compose run man echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
临时解决方案
在Dockerfile中添加以下内容似乎可解决问题:
RUN ln -s /usr/lib/jvm/java-11-openjdk-amd64/ /home/jenkins/jdk RUN chown jenkins:jenkins /home/jenkins/jdk
请问未安装的Java 8版本是从哪里来的?
内容的提问来源于stack exchange,提问作者JoSSte

