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操作系统,毕竟更新多,问题可能会被尽可能的解决。
相关推荐
若水晴空初如梦4 分钟前
QT聊天项目DAY06
开发语言·qt
h汉堡1 小时前
C++入门基础
开发语言·c++·学习
橘猫云计算机设计1 小时前
基于Springboot的自习室预约系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·毕业设计
HtwHUAT2 小时前
实验四 Java图形界面与事件处理
开发语言·前端·python
鄃鳕2 小时前
QSS【QT】
开发语言·qt
汤姆_5112 小时前
【c语言】深度理解指针4——sizeof和strlen
c语言·开发语言
秋书一叶2 小时前
SpringBoot项目打包为window安装包
java·spring boot·后端
碎梦归途2 小时前
23种设计模式-结构型模式之外观模式(Java版本)
java·开发语言·jvm·设计模式·intellij-idea·外观模式
极客先躯2 小时前
高级java每日一道面试题-2025年4月13日-微服务篇[Nacos篇]-Nacos如何处理网络分区情况下的服务可用性问题?
java·服务器·网络·微服务·nacos·高级面试
muyouking112 小时前
4.Rust+Axum Tower 中间件实战:从集成到自定义
开发语言·中间件·rust