Maven 项目构建时编译错误问题排查与解决

news2025/5/17 11:25:00

1. 问题描述

Maven 项目执行命令 mvn clean package 时出现编译错误,如下图所示
mvn 构建错误日志

2. 问题分析

由于是源码编译错误,于是通过查看项目 pom.xml 文件,得到项目源码使用的 Java 版本为 21

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<properties>
		<maven.compiler.source>21</maven.compiler.source>
		<maven.compiler.target>21</maven.compiler.target>
	</properties>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<!-- 源码的 Java 版本为 21 -->
					<source>${maven.compiler.source}</source>
					<!-- 最终源码编译为的 Java 版本为 21 -->
					<target>${maven.compiler.target}</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

再执行命令 mvn -v ,可知当前 mvn 命令依赖的 Java 环境是 Java 17,如下图所示,而项目源码需要编译为 Java 21,这相当于要使用 Java 17 编译生成 Java 21 的字节码,导致构建失败。
mvn 版本信息

Maven 本身也是一个 Java 应用,也就是说它本身的运行也是要基于 JVM 的,mvn -v 命令的输出信息中的 Java 版本就是其运行时依赖的 Java 环境;

Maven 的编译器插件 maven-compiler-plugin 其实并不知道如何编译 Java 源码,它实际是调用了 JDK 中的 javac 工具完成编译的,而这里的 javac 工具就是来源于 Maven 运行时依赖的 Java 环境;

javac 工具考虑了向后兼容性,即允许高版本的 javac 将源码编译为与其版本相同或者比其版本低的字节码,但是无法生成比起自身版本更高的字节码;

3. 问题解决

思路方向:升级 Maven 运行时的 Java 版本(即升级对应 javac 工具的版本)。

我们知道,使用 Maven 前,需要提前设置 Java 环境,设置好对应的 JAVA_HOME 环境变量,所以我们可以直接调整系统的环境变量 JAVA_HOME,让其指向 Java 21,再进行项目构建。但是这样调整会影响系统的其它 Maven 项目,其它 Maven 项目不一定都是使用 Java 21 的,所以采用下面的解决方案:

# 先在当前命令会话临时设置 JAVA_HOME 环境变量(如果是 Windows 系统,语法稍有不同)
JAVA_HOME=/path/to/java/21
# 再执行命令构建
mvn clean package

mvn 构建成功日志

注:可以通过查看 $MAVEN_HOME/bin/mvn 运行脚本的源码知道设置 JAVA_HOME 环境变量起作用的原因。

4. 问题记录

个人在解决问题过程中,发现在当前命令会话临时设置 JAVA_HOME 环境变量一直无法生效,后面经过一番艰辛探索,发现是个人系统存在 mavenrc 的相关文件导致的,该文件是 ~/.mavenrc,其文件内容为:

export JAVA_HOME=/usr/local/java/jdk-17.0.1

$MAVEN_HOME/bin/mvn 运行脚本会加载该文件,导致当前命令会话临时设置的 JAVA_HOME 环境变量被覆盖了。
加载 mavenrc 文件脚本源码
最后,考虑到 ~/.mavenrc 这种文件属于特定平台的配置,而不是 Maven 的标准配置,于是直接删除 ~/.mavenrc 文件,以便顺利解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安全生产调度管理系统的核心功能模块

安全生产调度管理系统是运用现代信息技术构建的智能化管理平台&#xff0c;旨在实现生产安全风险的全面管控和应急资源的优化调度。该系统通过整合物联网、大数据、人工智能等前沿技术&#xff0c;建立起覆盖风险监测、预警预测、指挥调度、决策支持的全链条安全管理体系。 一…

Linux进程信号(一)之信号的入门

文章目录 信号入门1. 生活角度的信号2. 技术应用角度的信号3. 注意4. 信号概念5.用kill -l命令可以察看系统定义的信号列表6. 信号处理常见方式 信号入门 1. 生活角度的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也…

基于springboot+vue的机场乘客服务系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 用户管理 航班信…

基于SpringBoot的房屋租赁管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

STM32外设AD/DA-基础及CubeMX配置

STM32外设AD/DA-基础及CubeMX配置 一&#xff0c;什么是AD/DA二&#xff0c;基础概念1&#xff0c;模拟 vs 数字2&#xff0c;AD转换1&#xff0c;分辨率 (Resolution)2&#xff0c;参考电压 (Reference Voltage, Vref)3&#xff0c;采样率 (Sampling Rate) 3&#xff0c;DA转换…

React Native简介

React Native 是由 Meta&#xff08;原 Facebook&#xff09;开源的跨平台移动应用开发框架&#xff0c;基于 React 和 JavaScript&#xff0c;允许开发者使用同一套代码库构建 iOS 和 Android 原生应用。通过 JavaScript 调用原生组件实现高性能渲染。 跨平台开发 共享 80%-9…

GCC 使用说明

参数 -fPIC ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so -fPIC 作用于编译阶段&#xff0c;告诉编译器产生与位置无关代码(Position-Independent Code)&#xff0c; 则产生的代码中&#xff0c;没有绝对地址&#xff0c;全部使用相对地址&#xff0c;故而代码可以被加…

Verilog HDL 语言整理

Verilog HDL 语言 Verilog HDL 简介 硬件描述语言Hardware Description Language是一种用形式化方法即文本形式 来描述和设计数字电路和数字系统的高级模块化语言 Verilog HDL&#xff08;Hardware Description Language&#xff09;是一种硬件描述语言&#xff0c;用于建模…

车道线检测----Lane-ATT

本文针对车道线检测----Lane-ATT论文所有细节进行阐述&#xff0c;有帮助的话点个收藏关注吧 保持对车道的关注&#xff1a;注意力引导的车道检测 摘要 但许多方法在保持实时效率方面存在问题&#xff0c;这对于自动驾驶车辆至关重要。在本文中&#xff0c;我们提出了LaneATT…

linux安装宝塔面板到数据盘

操作很简单&#xff0c;假如数据盘挂载在cipan1&#xff0c;在数据盘新建目录www&#xff0c;为了方便对应。 执行一下命令&#xff0c;创建软连接 ln -s /cipan1/www www 此时&#xff0c;根目录就出现了www文件夹 下面正常安装宝塔即可

【基础】Windows开发设置入门7:PowerShell的相关概念和使用

前言 大家熟悉的docker、Python&#xff0c;但对于Windows上有一套开配合开发的相对底层的环境设置&#xff0c;包括powershell、winget、WSL、还有开发驱动器什么的&#xff0c;我准备系统学一下&#xff0c;不然地基不牢&#xff0c;也盖不起冲天高楼~ 本节&#xff0c;介绍…

芯片生态链深度解析(一):基础材料篇——从砂砾到硅基王国的核心技术突围

【开篇&#xff1a;芯片——现代文明的“炼金术”】 当您滑动手机屏幕、驾驶新能源汽车、甚至用AI生成一幅画时&#xff0c;是否想过这些科技奇迹都始于一粒沙子&#xff1f;芯片&#xff0c;这个边长不足2厘米的黑色薄片&#xff0c;正是通过将砂砾提纯为高纯度硅锭&#xff…

一款利用ADB (安卓调试桥)来控制手机的玩机工具

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://drive.uc.cn/s/f36ed8ff62f74 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VOQDmKCq4u-CygjX9Tcn3fxEA1?pwdwf3t# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

使用mermaid 语言绘画时序图和链路图

给大家展示一下效果&#xff0c; 官方地址&#xff1a;https://mermaid.nodejs.cn/ 官方开发地&#xff1a;https://mermaid.nodejs.cn/intro/#google_vignette graph LR%% 样式定义&#xff08;完全保留&#xff09; classDef user fill:#E1F5FE,stroke:#0288D1;classDef …

浅论3DGS溅射模型在VR眼镜上的应用

摆烂仙君小课堂开课了&#xff0c;本期将介绍如何手搓VR眼镜&#xff0c;并将随手拍的电影变成3D视频。 一、3DGS模型介绍 3D 高斯模型是基于高斯函数构建的用于描述三维空间中数据分布概率的模型&#xff0c;高斯函数在数学和物理领域有着广泛应用&#xff0c;其在 3D 情境下…

6种方式来探究数据集的的方法worldquant

覆盖率百分比 指金融数据字段&#xff08;如股价、成交量、财务指标&#xff09;在时间或空间上的有效数据比例。 时间维度&#xff1a;数据在历史周期内的完整度&#xff08;如&#xff1a;某股票过去 1 年中&#xff0c;95% 的交易日有收盘价&#xff09;。空间维度&#xf…

深度学习中的归一化:提升模型性能的关键因素

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型辅助完成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认…

vue+threeJS 大理石贴图

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“vuethreeJS 大理石贴图”。 通过 Vue 3 和 Three.js 实现大理石纹理效果&#xff0c;并将这种技术应用于产品展示、虚拟展览、甚至是互动游戏之中&#xff0c;其潜力无穷。今天主要介绍基础的大理石贴图。 vueth…

WebGL 3着色器和GLSL

我们之前提到过着色器和GLSL&#xff0c;但是没有涉及细节&#xff0c;你可能已经对此有所了解&#xff0c; 但以防万一&#xff0c;这里将详细讲解着色器和GLSL。 在工作原理中我们提到&#xff0c;WebGL每次绘制需要两个着色器&#xff0c; 一个顶点着色器和一个片段着色器&…

华为OD机试真题——通信系统策略调度(用户调度问题)(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…