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操作系统,毕竟更新多,问题可能会被尽可能的解决。
相关推荐
Java基基6 小时前
sdkman 一键切换 JDK 版本管理工具
java·开发语言·sdkman
美好的事情能不能发生在我身上6 小时前
Jmeter压测遇到的问题
java·分布式·jmeter
春日见6 小时前
GIT操作大全(个人开发与公司开发)
开发语言·驱动开发·git·matlab·docker·计算机外设·个人开发
云烟成雨TD6 小时前
Spring AI 1.x 系列【14】三月双版本连发!Spring AI 最新功能全掌握
java·人工智能·spring
XiYang-DING6 小时前
【Java SE】var关键字
java·开发语言
还是大剑师兰特6 小时前
将 Utils.js 挂载为全局(window.Utils.xx)完整配置方案
开发语言·javascript·ecmascript
.YM.Z6 小时前
C++入门——缺省参数,函数重载,引用,inline函数,nullptr的介绍和使用
开发语言·c++
ulias2127 小时前
智能指针简述
开发语言·c++·算法
寻寻觅觅☆7 小时前
东华OJ-基础题-58-素数表(C++)
开发语言·c++·算法
专心搞代码7 小时前
【大模型开发】python基础(二)
开发语言·python