NoClassDefFoundError Jar Error for org/apache/poi/ss/usermod



我看到这个问题被问了很多,但我仍然无法找到解决方案。这个解决方案对我很有效。我有一个使用Apache POI的项目,我确保包括所有外部JAR。该项目在eclipse中编译和运行良好,但当我使用"java -jar Test.jar"运行jar时,我会收到以下错误:

线程"main"java.lang.NoClassDefFoundError:org/apache/poi/ss/usermodel/Sheet 中出现异常

我不确定这是否是有用的信息,但我为我的项目创建了一个lib文件夹,并将poi库放在那里。这意味着当我创建JAR文件时,依赖关系就在它中,我想我应该提到这一点,因为我看到了一些关于将外部JAR放在可执行JAR旁边的解决方案。我还尝试将类路径设置为项目的目录。

我好像做错了什么?

Apache POI JAR文件不在运行时类路径上。在MANIFEST.MF文件中使用以下清单条目重建Test.jar

Class-Path: poi-3.9-20121203.jar

java -jar [filename].jar命令失败时,几乎总是因为以下两件事之一:

  1. 你的MANIFEST.MF搞砸了,没有正确列出依赖项。确保清单文件中的所有jar依赖项都指向jar,相对于jar的父目录。

  2. 您缺少.class文件,无论是在您的特定jar中还是在您所依赖的jar中。请确保您的jar包含org/apache/poi/ss/usermodel/Sheet.class,或者您的清单层次结构指向包含该类的jar。

您需要在Jar文件的清单文件中提供类路径请参阅此官方文档

示例

我们想将MyUtils.jar中的类加载到类路径中,以便在MyJar.jar中使用。这两个jar文件位于同一目录中。

我们首先创建一个名为Manifest.txt的文本文件,其中包含以下内容:

Class-Path: MyUtils.jar

首先检查您的目标jar(Test.jar)是否是包含所有必需依赖项的胖jar。

$ jar tf Test.jar

您应该在那里看到lib/文件夹,其中包含所有必需的依赖项(包括Apache POI)。如果是这种情况,按照其他人的建议,将Apache POI添加到MANIFEST.MF中。

正如您所建议的,将您的jar依赖项放在一个单独的文件夹中也是可能的。想象一下,您的依赖关系存储在Test.jar之外的lib/文件夹中。您可以使用以下命令运行代码:

$ java -cp ".:lib/*" org.Test.Main

它只是将lib/文件夹中的所有.jar添加到类路径中。在这种情况下,您还需要指定主类的名称(全名)。

我也遇到了这个问题,并试图用谷歌搜索它。

我发现我必须阅读错误日志

我无法将文件保存到.xls,因此在我的案例中,在阅读错误后,我发现缺少一个jar文件我刚刚添加了位于我的ireport 的ext文件夹中的jar文件poi-3.7-201029

例如YourReportFolder/ireport/modules/ext-poi.x.x-xxxx

希望这有帮助:)

最新更新