Centos7 JDK 多版本管理与 Maven 构建问题和注意!

Linux操作系统下 JDK 多版本管理与 Maven 构建差异

背景:

在 JDK 多版本环境 下,系统通过 alternatives 控制多个 JDK 版本的切换。alternatives 是一个在 Linux 系统中用于管理多版本软件(如 Java、Python 等)工具,它允许用户轻松选择并设置不同的默认版本。这个备忘录记录了在 Ubuntu 22CentOS 7 操作系统中,Maven 在构建 Java 项目时如何处理多版本 JDK 的行为差异,并提供了相应的解决方案。

问题描述:
  1. Ubuntu 22 :未设置 JAVA_HOME,系统通过 PATHalternatives 进行 JDK 多版本管理,Maven可以通过mvn clean install 构建成功。

    bash 复制代码
    echo $JAVA_HOME # 无任何输出
    java -version # 输出显示为 JDK 11
  2. CentOS 7 :未设置 JAVA_HOME 时,系统没有自动找到正确的 JDK 版本,Maven 构建失败,即使运行Ubuntu22打包好的jar包也无法运行。如:java -jar xxx.jar会报错退出,但是会显示出springboot的图标输出...

    bash 复制代码
    echo $JAVA_HOME # 无任何输出
    java -version # 输出显示为 JDK 11,似乎是正常的,问题就很难发现。
原因分析:
  • Ubuntu 22

    • 系统较新,alternativesPATH 配置完善,能够自动选择和使用正确的 JDK 版本,即使没有手动设置 JAVA_HOME 也可以正常运行。
  • CentOS 7

    • 系统较老,虽然也使用 alternatives 进行 JDK 管理,但需要手动设置 JAVA_HOME,否则 Maven 无法找到正确的 JDK 版本。
解决方案:

针对 CentOS 7 的问题,建议进行以下操作:

  1. 显式设置 JAVA_HOME

    手动设置 JAVA_HOME 指向 JDK 11,并更新 PATH 环境变量:

    bash 复制代码
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
    export PATH=$JAVA_HOME/bin:$PATH

    永久生效 :将上述命令添加到 ~/.bashrc~/.bash_profile 中,然后运行:

    bash 复制代码
    source ~/.bashrc
    echo $JAVA_HOME # 此时应该显示未 JDK 11,而不是显示空行.
    java -version # 输出显示为 JDK 11
  2. 确保 alternatives 配置正确

    使用 alternatives 工具检查并设置 JDK 11 为默认版本:

    bash 复制代码
    sudo alternatives --config java
    sudo alternatives --config javac

    选择 JDK 11 并确保 java -versionjavac -version 输出正确版本。

  3. 清理并重新构建

    设置好 JAVA_HOME 后,清理并重新构建项目:

    bash 复制代码
    mvn clean install
总结:
  • Ubuntu 22 :得益于系统的 alternativesPATH 管理功能,未设置 JAVA_HOME 也能自动找到并使用正确的 JDK 版本,Maven 构建成功。

  • CentOS 7 :由于系统较老,alternatives 对多版本 JDK 的管理不够智能,需要手动设置 JAVA_HOME 变量,确保 Maven 能找到正确的 JDK 版本,才能完成构建。

需要注意的几点:
  1. JAVA_HOME 必须指向正确的 JDK 安装目录,特别是在多版本管理的环境中。
  2. 确认 alternatives 工具是否正确指向需要的 Java 版本。
  3. 对于老旧的系统(如 CentOS 7),需要手动进行更多的配置,而较新的系统(如 Ubuntu 22)可以自动管理多版本 JDK。
  4. 对于 Maven 构建,需要注意 尽量使用 Ubtuntu22操作系统,毕竟更新多,问题可能会被尽可能的解决。
相关推荐
oak隔壁找我2 小时前
JVM常用调优参数
java·后端
蝎子莱莱爱打怪6 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
狼爷7 小时前
Go 没有 override?别硬套继承!用接口+嵌入,写更清爽的“覆盖”逻辑
java·go
小兔崽子去哪了10 小时前
Java 自动化部署
java·后端
ma_king10 小时前
入门 java 和 数据库
java·数据库·后端
后端AI实验室10 小时前
我用Cursor开发了3个月,整理出这套提效4倍的工作流
java·ai
码路飞14 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing15 小时前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven9716 小时前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德1 天前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty