背景
我在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/javasudo 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版是从哪里来的呢?
1条答案
按热度按时间46qrfjad1#
我浪费了2天的时间,我发现我运行的Docker容器安装了两个JDK(一个是默认的CentOS 7,另一个是我在Dockerfile中添加的)。这导致了兼容性问题,因为我的主机上的DOCKER在JDK 11上运行,而Docker容器(作为从属容器)选择了JDK 8,因为两个Java环境都可用。
您可以在docker文件中创建并添加脚本,以始终选择JDK 11的运行时