Linux操作系统下 JDK 多版本管理与 Maven 构建差异
背景:
在 JDK 多版本环境 下,系统通过 alternatives
控制多个 JDK 版本的切换。alternatives
是一个在 Linux 系统中用于管理多版本软件(如 Java、Python 等)工具,它允许用户轻松选择并设置不同的默认版本。这个备忘录记录了在 Ubuntu 22 和 CentOS 7 操作系统中,Maven 在构建 Java 项目时如何处理多版本 JDK 的行为差异,并提供了相应的解决方案。
问题描述:
-
Ubuntu 22 :未设置
JAVA_HOME
,系统通过PATH
和alternatives
进行 JDK 多版本管理,Maven可以通过mvn clean install
构建成功。bashecho $JAVA_HOME # 无任何输出 java -version # 输出显示为 JDK 11
-
CentOS 7 :未设置
JAVA_HOME
时,系统没有自动找到正确的 JDK 版本,Maven 构建失败,即使运行Ubuntu22打包好的jar包也无法运行。如:java -jar xxx.jar会报错退出,但是会显示出springboot的图标输出...bashecho $JAVA_HOME # 无任何输出 java -version # 输出显示为 JDK 11,似乎是正常的,问题就很难发现。
原因分析:
-
Ubuntu 22:
- 系统较新,
alternatives
和PATH
配置完善,能够自动选择和使用正确的 JDK 版本,即使没有手动设置JAVA_HOME
也可以正常运行。
- 系统较新,
-
CentOS 7:
- 系统较老,虽然也使用
alternatives
进行 JDK 管理,但需要手动设置JAVA_HOME
,否则 Maven 无法找到正确的 JDK 版本。
- 系统较老,虽然也使用
解决方案:
针对 CentOS 7 的问题,建议进行以下操作:
-
显式设置
JAVA_HOME
:手动设置
JAVA_HOME
指向 JDK 11,并更新PATH
环境变量:bashexport JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$JAVA_HOME/bin:$PATH
永久生效 :将上述命令添加到
~/.bashrc
或~/.bash_profile
中,然后运行:bashsource ~/.bashrc echo $JAVA_HOME # 此时应该显示未 JDK 11,而不是显示空行. java -version # 输出显示为 JDK 11
-
确保
alternatives
配置正确 :使用
alternatives
工具检查并设置 JDK 11 为默认版本:bashsudo alternatives --config java sudo alternatives --config javac
选择 JDK 11 并确保
java -version
和javac -version
输出正确版本。 -
清理并重新构建 :
设置好
JAVA_HOME
后,清理并重新构建项目:bashmvn clean install
总结:
-
Ubuntu 22 :得益于系统的
alternatives
和PATH
管理功能,未设置JAVA_HOME
也能自动找到并使用正确的 JDK 版本,Maven 构建成功。 -
CentOS 7 :由于系统较老,
alternatives
对多版本 JDK 的管理不够智能,需要手动设置JAVA_HOME
变量,确保 Maven 能找到正确的 JDK 版本,才能完成构建。
需要注意的几点:
- JAVA_HOME 必须指向正确的 JDK 安装目录,特别是在多版本管理的环境中。
- 确认
alternatives
工具是否正确指向需要的 Java 版本。 - 对于老旧的系统(如 CentOS 7),需要手动进行更多的配置,而较新的系统(如 Ubuntu 22)可以自动管理多版本 JDK。
- 对于 Maven 构建,需要注意 尽量使用
Ubtuntu22
操作系统,毕竟更新多,问题可能会被尽可能的解决。