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操作系统,毕竟更新多,问题可能会被尽可能的解决。
相关推荐
郑州光合科技余经理2 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
萧瑟余晖2 小时前
Java深入解析篇三十三之密封类与接口(Sealed Classes)详解
java·开发语言
论迹复利6 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin6 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
736c6 小时前
C语言-数组 07
c语言·开发语言
宸津-代码粉碎机6 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_963749107 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh8 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
LorryJovens8 小时前
【LAAP科研】CEN因果等价网络理论---从双缝干涉到因果等价
开发语言·php
源码宝8 小时前
SpringBoot+Vue2 诊所门诊管理系统,完整前后端源码,可直接部署上线
java·源码·his系统·门诊系统·程序代码·诊所系统·门诊his