jenkins Java Docker build slave即使没有安装也能找到Java 8

f8rj6qna  于 12个月前  发布在  Jenkins
关注(0)|答案(1)|浏览(134)

背景

我在Ubuntu 18.04上有一个运行Java版本11的Jenkins服务器,通过访问 /manage/systemInfo 进行检查
java.specification.version 11
我已经实现了基于Ubuntu 22.04的docker build slaves,其中我指定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:哈德逊/remoting/Launcher已由较新版本的Java运行时(类文件版本55.0)编译,此版本的Java运行时仅识别52.0以下的类文件版本
此问题引用List of Java class file format major version numbers?类版本:
52是Java 8
55是Java 11
果然,在日志中更远的地方:
[11[SSH]检查java的java版本
[11/14/22 18:35:38] [SSH] java -版本返回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
甚至在安装opendjk之前将RUN java -version注入到我的Dockerfile中(这表明没有安装Java...)
在主机上运行apt list --installed |grep jdk
openjdk-11-jdk/bionic-updates,bionic-security,now 11.0.17+8- 1ubuntu 2 ~18.04 amd 64 [已安装]
openjdk-11-jdk-headless/bionic-updates,bionic-security,now 11.0.17+8- 1ubuntu 2 ~18.04 amd 64 [已安装]
openjdk-11-jre/bionic-updates,bionic-security,now 11.0.17+8- 1ubuntu 2 ~18.04 amd 64 [已安装]
openjdk-11-jre-headless/bionic-updates,bionic-security,now 11.0.17+8- 1ubuntu 2 ~18.04 amd 64 [已安装,自动]
..
/运行find -name java* 2>/dev/null也没有给予任何有用的信息

which java输出

主机:

$java
/usr/bin/java $ ls -l /usr/bin/java
lrwxrwxrwx 1根根22 11月24日2018 /usr/bin/java -> /etc/alternatives/java
$ ls -l /etc/alternatives/java
/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
/usr/bin/java -> /etc/alternatives/java
$ sudo docker compose run man ls -l /etc/alternatives/java
/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

提问

那么,JDK第8版是从哪里来的呢?

46qrfjad

46qrfjad1#

我浪费了2天的时间,我发现我运行的Docker容器安装了两个JDK(一个是默认的CentOS 7,另一个是我在Dockerfile中添加的)。这导致了兼容性问题,因为我的主机上的DOCKER在JDK 11上运行,而Docker容器(作为从属容器)选择了JDK 8,因为两个Java环境都可用。
您可以在docker文件中创建并添加脚本,以始终选择JDK 11的运行时

RUN echo 2 | alternatives --config java

相关问题