Java org/apache/poi/ss/usermodel/Sheet的NoClassDefFoundError Jar错误

Java org/apache/poi/ss/usermodel/Sheet的NoClassDefFoundError Jar错误,java,noclassdeffounderror,Java,Noclassdeffounderror,我看到这个问题被问了很多次,但我仍然找不出解决办法。一个对我有效的解决方案。我有一个使用ApachePOI的项目,我确保包含所有外部JAR。该项目在eclipse中编译并运行良好,但当我使用“java-jar Test.jar”运行jar时,出现以下错误: 线程“main”java.lang.NoClassDefFoundError中出现异常:org/apache/poi/ss/usermodel/Sheet 我不确定这是否是有用的信息,但我为我的项目创建了一个lib文件夹,并将poi库放在其中

我看到这个问题被问了很多次,但我仍然找不出解决办法。一个对我有效的解决方案。我有一个使用ApachePOI的项目,我确保包含所有外部JAR。该项目在eclipse中编译并运行良好,但当我使用“
java-jar Test.jar
”运行jar时,出现以下错误:

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

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


我似乎做错了什么?

您需要在Jar文件的清单文件中提供类路径

示例

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

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

Class-Path: MyUtils.jar

您需要在Jar文件的清单文件中提供类路径

示例

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

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

Class-Path: MyUtils.jar
不在运行时类路径上。使用
manifest.MF
文件中的以下清单条目重新生成
Test.jar

Class-Path: poi-3.9-20121203.jar
不在运行时类路径上。使用
manifest.MF
文件中的以下清单条目重新生成
Test.jar

Class-Path: poi-3.9-20121203.jar

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

  • 您的MANIFEST.MF出错,无法正确列出依赖项。确保清单文件中的所有jar依赖项都指向jar,相对于jar的父目录

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


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

  • 您的MANIFEST.MF出错,无法正确列出依赖项。确保清单文件中的所有jar依赖项都指向jar,相对于jar的父目录

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


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

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

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

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

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

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

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

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

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

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

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

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

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

    例如:yourreportfolder/ireport/modules/ext-poi.x.x-xxxx


    希望这有帮助:)

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

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

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

    例如:yourreportfolder/ireport/modules/ext-poi.x.x-xxxx


    希望这有帮助:)

    我尝试了这个,但仍然得到相同的错误。这是我放在清单类路径中的内容:lib/poi-3.9/poi-3.9-20121203.jar我仍然使用“java-jar Test.jar”运行我的jar。看起来不错,请检查清单文件末尾是否有换行符。还要检查清单是否正确包含(通过将其取消归档到临时文件夹)。最后检查poi jar文件的路径是否正确。我已取消连接并检查MANIFEST.MF文件。该文件包含在内,它有一个换行符,我非常确定路径是正确的。类路径是来自清单文件还是来自项目目录?类路径是相对于运行jar的位置的。谢谢,我是个白痴。我的代码