[英]What causes this: java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator;
[英]java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator;
我需要一些关于错误的帮助。 我有一个带有以下jar文件的javafx项目
我需要的是导入一些excel数据。 我已经导入了上面的jar文件
但不幸的是,当我尝试运行该项目时,我收到错误:
Caused by: java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator;
at app.controllers.ContentAreaController.nextActionReport(ContentAreaController.java:734)
... 62 more
我试过谷歌搜索,建议我改变poi lib文件的版本,但没有运气。任何人都建议我的解决方案,因为我已经花了足够的时间在这个问题上
将一些注释推广到答案 - 您的类路径上有较旧的Apache POI jar。 根据此POI常见问题解答 - 不支持在版本之间混合POI jar
您需要做的就是删除旧的POI罐。 我只是说,因为你不知道你有他们......幸运的是, 如果你按照这个Apache POI常见问题中的代码,它将帮助你找到旧罐子的来源 。 在有问题的系统上运行时,这样的东西应该打印出旧罐子的名称和位置:
ClassLoader classloader =
org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource(
"org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
System.out.println("POI Core came from " + path);
classloader = org.apache.poi.POIXMLDocument.class.getClassLoader();
res = classloader.getResource("org/apache/poi/POIXMLDocument.class");
path = res.getPath();
System.out.println("POI OOXML came from " + path);
classloader = org.apache.poi.hslf.usermodel.HSLFSlideShow.class.getClassLoader();
res = classloader.getResource("org/apache/poi/hslf/usermodel/HSLFSlideShow.class");
path = res.getPath();
System.out.println("POI Scratchpad came from " + path);
只需识别您不想要的旧罐子,移除,就应该设置好!
Gagravarr的回答https://stackoverflow.com/a/50472754/1497139指向http://poi.apache.org/help/faq.html#faq-N10006
我修改了使用JUnit Test的代码来修复相同的基本问题,并出现以下错误消息:
java.lang.NoSuchMethodError: org.apache.poi.xssf.usermodel.XSSFCell.getCellTypeEnum()Lorg/apache/poi/ss/usermodel/CellType;
如果首先想到这是一个弃用问题。 在修复了弃用后我得到了:
java.lang.NoSuchMethodError: org.apache.poi.xssf.usermodel.XSSFCell.getCellType()Lorg/apache/poi/ss/usermodel/CellType;
这是由于在同一个项目中混合使用Apache POI 3.12和Apache POI 4.0.1 jar。
为了避免将来这种情况,我创建了以下单元测试。 您可能希望根据需要调整版本,或者在仍然调试问题时跳过断言。
JUnit Test用于检查已使用类的POI版本。
/**
* get the path the given class was loaded from
*
* @param clazz
* @return the path
*/
public String getClassLoaderPath(Class<?> clazz) {
ClassLoader classloader = clazz.getClassLoader();
String resource = clazz.getName().replaceAll("\\.", "/") + ".class";
URL res = classloader.getResource(resource);
String path = res.getPath();
return path;
}
@Test
public void testPOI() {
Class<?>[] classes = {
org.apache.poi.poifs.filesystem.POIFSFileSystem.class,
org.apache.poi.ooxml.POIXMLDocument.class,
org.apache.poi.hslf.usermodel.HSLFSlideShow.class,
org.apache.poi.xssf.usermodel.XSSFCell.class,
org.apache.poi.ss.usermodel.CellType.class};
for (Class<?> clazz : classes) {
String path = getClassLoaderPath(clazz);
if (debug)
System.out.println(
String.format("%s came from %s", clazz.getSimpleName(), path));
assertTrue(path.contains("4.0.1"));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.