多jdk版本环境下,jenkins系统设置需指定JAVA_HOME环境变量

一、背景

由于不同项目对jdk版本的要求不同,有些是要求jdk11,有些只需要jdk8即可。

而linux机器上安装jdk的方式又多种多样,最后导致jenkins打包到底使用的是哪个jdk,比较混乱。

1、java在哪

bash 复制代码
> whereis java
java: /usr/bin/java /opt/jdk-11.0.17/bin/java /opt/jdk1.8.0_351/bin/java /usr/share/man/man1/java.1

可以看到这里有三个java版本:

  • /usr/bin/java (原先安装的jdk)
  • /opt/jdk-11.0.17/bin/java
  • /opt/jdk1.8.0_351/bin/java (新安装的jdk,期望使用该版本)

这里的安装方式有两种:

  • update-alternatives 多版本管理软件(第一个)
  • 手动安装(后两者)

2、什么是update-alternatives

在 CentOS 和许多其他 Linux 发行版中,/etc/alternatives 目录是用来管理软件的多个版本的。这是一个系统级别的工具,用于在安装了多个版本的同一软件时选择默认版本。

对于 Java,当你安装不同版本的 JDK 时,每个版本的二进制文件(如 java, javac, javadoc 等)都会被放置在 /etc/alternatives 目录下,并且会创建指向这些二进制文件的符号链接(symlink)。这些符号链接位于 /usr/bin 目录下,以便用户可以通过标准的命令行接口访问这些工具。

见/usr/bin目录下:

例如,如果你运行 java -version,系统实际上是在运行 /etc/alternatives/java 指向的版本。/etc/alternatives 目录中的每个 Java 相关文件都是一个脚本,它检查 JAVA_HOME 环境变量,如果设置了,就使用它;如果没有设置,它会使用 update-alternatives 系统配置的默认值。

bash 复制代码
> update-alternatives --config java

There is 1 program that provides 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/java/jdk1.8.0_181-amd64/jre/bin/java

Enter to keep the current selection[+], or type selection number:

3、手动安装jdk

解压缩至某个目录,然后配置jdk环境变量。

bash 复制代码
export JAVA_HOME=/opt/jdk1.8.0_351
export PATH=$PATH:$JAVA_HOME/bin

二、到底用的是哪个jdk

1、maven

当你执行mvn -v命令,看到它使用的jdk是我们期望的/opt/jdk1.8.0_351/bin/java版本。

bash 复制代码
> mvn -v
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: /opt/maven
Java version: 1.8.0_351, vendor: Oracle Corporation, runtime: /opt/jdk1.8.0_351/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-642.el6.x86_64", arch: "amd64", family: "unix"

所以,在jenkins机器上,手动mvn package打包,没问题。

但是,当你执行java -version的时候,发现并不是/opt/jdk1.8.0_351/bin/java

bash 复制代码
> java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

说明虽然设置了JAVA_HOME环境变量,但是/usr/bin/java的优先级更高。

这一点,我们从whereis java的顺序也可以看出。

2、jenkins

在没有设置JAVA_HOME的情况下,默认使用的jdk是/usr/java/jdk1.8.0_181-amd64/jre/bin/java

所以第一次打包报错:

三、jenkins系统设置

指定JAVA_HOME环境变量,明确jenkins在众多jdk中选择哪个jdk


  • JAVA_HOME : /opt/jdk1.8.0_351

再次打包,jenkins就能选择出你所需的jdk版本。

相关推荐
迪康Defender2 分钟前
终端供应链安全:应用白名单与软件正版化检测落地|终端安全治理实践
运维·服务器·网络·安全·web安全·自动化·运维开发
海的透彻1 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat1 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习2 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one2 小时前
算法--构造
java·数据结构·算法
SL_staff2 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
万联WANFLOW3 小时前
异地厂区视频监控远程运维:从组网到安全的实施要点
运维·网络·安全·企业组网·sdwan
SL_staff3 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
十碗饭吃不饱3 小时前
SSH 密钥认证详解:原理、实操、参数、排错与加固
运维·ssh
长不大的杨瑞杰4 小时前
OpenCode v2 配置工程实战:Config 优先级、JSONC、变量替换与多环境治理
人工智能·安全·云计算·软件工程·devops