easyexcel和poi版本冲突报错深入解析v2

easyexcel报错解决

问题

项目由poi改用easyexcel,报错如下: java.lang.NoSuchMethodError: ‘org.apache.poi.ss.usermodel.CellType
org.apache.poi.ss.usermodel.Cell.getCellType()’

原因

easyexcel中的poi和项目原本的poi版本冲突问题。 由于之前做过easyexcel项目,就把所以子工程pom里的poi注释掉了。
关键:忽略了parent项目pom的dependencyManagement中版本锁定的poi,这里误以为在子工程未使用就不会冲突。

解决

将项目所有有关poi的dependency全部注释掉,包括dependencies和dependencyManagement。
推荐:使用快捷键ctrl+shift+f直接搜索poi,找到直接注释

上述只是问题的解决方案,并没有系统的介绍为什么会报错。

1.问题

1、报的什么错?NoSuchMethodError 方法不存在错误
2、发生在编译期,还是运行时?
3、如果发生在运行时,为什么编译的时候没有识别出来这个方法不存在?

那么通过下面的解析,会清楚的理解上述问题。

2.模拟错误

由于easyexcel源码不方便修改,所以这里使用自己代码实现(代码无实际意义),主要演示报错。

2.1创建2个maven项目

easye模拟easyexcel,poi模拟poi。
在这里插入图片描述
自己项目调用了easyexcel的方法,而easyexcel又调用了poi方法。所以模拟,需要在poi创建一个getType方法。easye里创建testGet方法调用getType方法。

具体代码如下:
poi的pom:初始版本设置为1.0,版本后面会更改

<?xml version="1.0" encoding="UTF-8"?>
<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"><modelVersion>4.0.0</modelVersion><parent><groupId>cn.zxh</groupId><artifactId>test01</artifactId><version>1.0</version></parent><groupId>cn.zxh</groupId><artifactId>poi</artifactId><version>1.0</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>

CellImpl.java

package cn.zxh.poi;public class CellImpl implements Cell {@Overridepublic int getType() {return 1;}
}

Cell.java

package cn.zxh.poi;public interface Cell {public int getType();
}

easye的pom:初始版本设置为1.0,引用poi1.0版本库

<?xml version="1.0" encoding="UTF-8"?>
<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"><modelVersion>4.0.0</modelVersion><parent><groupId>cn.zxh</groupId><artifactId>test01</artifactId><version>1.0</version></parent><groupId>cn.zxh</groupId><artifactId>easye</artifactId><version>1.0</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>cn.zxh</groupId><artifactId>poi</artifactId><version>1.0</version></dependency></dependencies></project>

MyGet.java

package cn.zxh.easye;import cn.zxh.poi.Cell;
import cn.zxh.poi.CellImpl;
import java.util.Objects;public class MyGet {public void testGet(){Cell cell = new CellImpl();//没有实际意义,主要是调用getTypeif(Objects.equals(cell.getType(),1)){System.out.println("pass");}System.out.println("fail");}
}

2.2安装到本地maven仓库

点击安装
在这里插入图片描述
然后找到自己的maven仓库内容如下
在这里插入图片描述

在这里插入图片描述

2.3在其他项目引入easye库

注:找个别的工程(不要还在这个工程),因为模拟引入easyexcel。自己工程肯定和easyexcel不在一个工程下。
在这里插入图片描述

2.4创建测试类并模拟调用

这里直接调用MyGet 的testGet。

package com.zxh.project.test1;import cn.zxh.easye.MyGet;
import cn.zxh.poi.Cell;public class MyTest {public static void main(String[] args) {MyGet myGet = new MyGet();myGet.testGet();}
}

这里先模拟版本一致正常情况,发现正常运行。
在这里插入图片描述

2.5降低poi的版本

找到之前自己的poi项目,更改getType,这里把返回类型换成String。
在这里插入图片描述
在这里插入图片描述

poi.pom里的版本改为0.5,然后只打包poi
在这里插入图片描述

在这里插入图片描述

2.6使用降低poi0.5版本

其他项目pom引入0.5版本
在这里插入图片描述
这里运行时会使用0.5,这就是常见的poi和easyexcel版本的冲突。
在这里插入图片描述

2.6错误模拟成功

果然不出所料,运行时报错了,这里打了断点,编译肯定通过的,确实为运行时报错。
在这里插入图片描述
在这里插入图片描述

2.7再再降低poi版本

重复上部分,降低到0.1,直接把poi中的getType的方法删掉(方便理解),再打包,然后引入改为0.1

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
发现依然编译通过,运行时报错。

3.原因分析

那么有疑问,既然用的是低版本poi0.1库,这个方法都不存在,为什么还编译通过了呢。那么再做个实验。

首先将easye1.0 和MyTest复制到另一个普通java项目。

在这里插入图片描述
在这里插入图片描述
然后添加类库
在这里插入图片描述

然后这里也是运行时报错,只是错误变了,类不存在。因为压根就没有引入poi的库,只引入了easye,poi库中的类肯定不存在
在这里插入图片描述
然后这里引入的easye库(包括maven引入的),都是已经编译好的.class文件
在这里插入图片描述

4.总结

那么我们就可以大胆的猜测了(为什么时猜测,我也不知道对不对,欢迎大家讨论)
编译阶段,仅仅对直接引入的库中的方法进行检测是否存在,例如这里只判断easye库的MyGet.testGet,而easye库如果引用了其他库的方法,例如poi中的方法,由于已经编译成了MyGet.class,不再进行MyGet.class重新编译,所以深层的方法不在编译器发现(因为编译MyTest.class,只需要知道MyGet.testGet即可)。

JVM运行时,会根据方法的签名进行调用,如果方法的签名不在,报错。
下面为MyGet.testGet的class源码,
其中invokeinterface #4 <cn/zxh/poi/Cell.getType : ()I> count 1
这里就是获取cn/zxh/poi/Cell.getType : ()I 这种签名的方法。如果没有报错。

2.6错误模拟成功

这里报错是getType已经改成了String类型,I标识int,签名不一致找不到。

2.7再再降低poi版本

这里报错更简单,直接方法都删掉了,签名肯定找不到。

3.原因分析

这个里面的报错,是根据下面的源码
0 new #2 <cn/zxh/poi/CellImpl>
根据类路径找不到类,库都没有引入,所以报错。

 0 new #2 <cn/zxh/poi/CellImpl>3 dup4 invokespecial #3 <cn/zxh/poi/CellImpl.<init> : ()V>7 astore_18 aload_19 invokeinterface #4 <cn/zxh/poi/Cell.getType : ()I> count 1
14 invokestatic #5 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>
17 iconst_1
18 invokestatic #5 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>
21 invokestatic #6 <java/util/Objects.equals : (Ljava/lang/Object;Ljava/lang/Object;)Z>
24 ifeq 35 (+11)
27 getstatic #7 <java/lang/System.out : Ljava/io/PrintStream;>
30 ldc #8 <pass>
32 invokevirtual #9 <java/io/PrintStream.println : (Ljava/lang/String;)V>
35 getstatic #7 <java/lang/System.out : Ljava/io/PrintStream;>
38 ldc #10 <fail>
40 invokevirtual #9 <java/io/PrintStream.println : (Ljava/lang/String;)V>
43 return

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

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

相关文章

数据结构---排序算法

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

数据中心机房建设标准

数据中心机房是专门设计用于存放、管理和维护计算机服务器、网络设备、存储设备以及其他IT基础设施的物理空间。它们是信息化社会的基石&#xff0c;为各种在线服务提供硬件和网络支持。数据中心机房的主要功能包括数据存储、处理、传输以及提供计算资源。 数据中心机房建设涉及…

用python绘制三维条形图

用python绘制三维条形图 三维条形图特点与用途 效果代码 三维条形图 三维条形图是一种在三维空间中表示数据的方法&#xff0c;它通过垂直或水平的条形长度来显示类别之间的差异。与传统的二维条形图相比&#xff0c;三维条形图增加了深度或高度的维度&#xff0c;使得数据可视…

数理化解题研究杂志社数理化解题研究编辑部2024年第12期目录

教学设计与教学策略研究 聚焦数学思想 贯彻核心素养——以“函数的奇偶性”的教学设计为例 宋方宁;李硕; 2-4 高中数学课堂案例研究——探讨“教-学-评”一体化模式的应用 赖琰媛;曹小燕; 5-7 漫谈体验式教学在高中数学教学中的运用策略 林素珍; 15-17《数理化解题…

洁盟超声波清洗机怎么样?2024爆款机型声波清洗机测评、一篇看懂

随着现在近视率的逐年上升&#xff0c;戴眼镜的人群越来越多&#xff01;当然他们也在面临着一个眼镜清洗的问题&#xff01;因为长期佩戴眼镜&#xff0c;镜框还有镜片上面都是会积累灰尘、油污、污垢以及细菌&#xff0c;脏脏的不仅令眼镜不美观&#xff0c;同时在长期的佩戴…

【嵌入式】SD NAND:SD卡的集成与优化

嵌入式SD卡&#xff0c;也称为SD NAND或贴片式SD卡&#xff0c;是一种专为空间受限的设备设计的存储解决方案。这种存储卡与传统的SD卡不同&#xff0c;它采用贴片式封装&#xff0c;可以直接焊接到设备的PCB上&#xff0c;从而为电子设备提供内置存储功能。以下是嵌入式SD卡的…

简单介绍vim

文章目录 前言一、Vim的特点二、安装Vim三、设置Vim配置文件的位置&#xff1a;编辑配置文件&#xff1a;添加配置选项&#xff1a;保存并退出编辑器&#xff1a;快速配置验证设置&#xff1a; 总结 前言 Vim是一款强大的文本编辑器&#xff0c;被广泛用于各种编程和文本编辑任…

canvas实现画布拖拽效果 适配Uniapp和Vue (开箱即用)

需求:我司是做AIGC项目最近和地铁项目有关需要实现海报效果图&#xff0c;并且需要使用画布拖拽和修改上传删除等等功能 当时连续加班花了10个工作日搓出来 实现挺简单的但是Canvas数据处理还是挺麻烦的 大概功能如图下 首先我们需要引入Fabric.js 这个库封装好了原生的Canva…

C#唯一进程的处理Winform/WPF

C#唯一进程的处理 1.使用进程&#xff08;Process&#xff09;判断winformWPF执行效果&#xff1a; 2.使用互斥体&#xff08;Metux&#xff09;实现winformWPF实现效果&#xff1a; 在C#客户端&#xff08;Winform/WPF&#xff09;开发过程中&#xff0c;有的情况需要确保程序…

三分钟搞懂AI Agent是什么!

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

mindmapper17软件最新版下载-MindMapper17(思维导图软件)下载附加详细安装步骤

​​MindMapper​​​是一款专业的可视化思维导图软件&#xff0c;通过智能绘图方法&#xff0c;在管理信息和处理工作流程中&#xff0c;帮助提高组织、审查、合作、分享和交流能力。《思维导图三招十八式》作者也一直力荐 MindMapper这款软件。思维导图是表达发射性思维的有效…

《详解》如何在ROS中建立MQTT通信

观前提醒&#xff1a;本期主要内容为ROS中MQTT通信节点的编程&#xff0c;和ROS部分底层通信机制的浅析 一、复习一下&#xff1a;ROS通信机制&MQTT通信异同点 ROS通信机制概述 ROS中的主要通信机制有以下几种&#xff1a; 话题 (Topics) 发布/订阅模型&#xff08;Pu…

Android 断点续传基础之单线程下载

**遇到的问题&#xff1a;**在这因为返回值的问题烦躁了一下&#xff0c;有可能出现空指针的异常&#xff0c;已经提出成文章了 请参考http://blog.csdn.net/qq_27489007/article/details/53523378 文件关系图 断点续传流程图 开始撸代码(主要代码) /** 普通断点续传 */ …

AI 生成文本工具推荐(AI 对话/AI 聊天机器人/AI 写作)

① boardmix AI boardmix AI&#xff0c;是一个在线的智能 AI 对话 App&#xff0c;打开浏览器即可在线使用&#xff0c;支持 AI 多轮连续对话&#xff0c;提供 AI 角色切换、AI 多语言翻译、一键唤出、可视化表达及多人协作功能。 boardmix AI 预置了多个不同的 AI 角色&…

⭐Unity 控制任意UI的渐隐渐显

使用脚本之前先给要控制的UI加上CanvasGroup组件 解释: 这个脚本使用协程来逐渐改变CanvasGroup的alpha值&#xff0c;从而实现渐隐和渐显的效果。 Mathf.Lerp函数用于在指定的时间内平滑地从当前透明度过渡到目标透明度。 通过调用FadeIn和FadeOut方法&#xff0c;你可以在任…

eNSP学习——配置DHCP中继

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建OSPF网络 3、配置DHCP服务器 4、配置DHCP中继 5、配置PC获取地址方式为DHCP 主要命令 //配置指定DHCP服务器的方法 //方法一&#xff1a;在面向PC的接口下直接配置DHCP服…

CP AUTOSAR标准之LargeDataCOM(AUTOSAR_CP_SWS_LargeDataCOM)(更新中……)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块LdCom的功能、API和配置。   在AUTOSAR分层架构中,AUTOSAR LdCom模块位于RTE/SwCluC_LdComProxy和PDU路由之间,参见[1,EXP LayeredSoftwareArchitecture]。   AUTOSAR LdCom模块提供了一种替代的交互层机制。通过专注于…

Ubuntu 使用Vscode的一些技巧 ROS

Ubuntu VSCode的一些设置&#xff08;ROS&#xff09; 导入工作空间 推荐只导入工作空间下的src目录 如果将整个工作空间导入VSCode&#xff0c;那么这个src就变成了次级目录&#xff0c;容易在写程序的时候把本应该添加到具体工程src目录里的代码文件给误添加到这个catkin_w…

MySQL(5)

聚合函数 GROUP BY 的使用 需求&#xff1a;查询各个部门的平均工资&#xff0c;最高工资SELECT department_id,AVG(salary),SUM(salary)FROM employeesGROUP BY department_id;需求&#xff1a;查询各个job_id的平均工资SELECT job_id,AVG(salary)FROM employeesGROUP BY jo…