gpt4 book ai didi

java - 使用 Apache.POI 并仅在从 JAR 文件运行时收到错误消息

转载 作者:行者123 更新时间:2023-11-30 11:12:46 25 4
gpt4 key购买 nike

我正在使用 Apache POI 处理 XLS 电子表格文件,然后生成 DOCX word 文档。该程序本身运行良好,但从 jar 运行时出现错误消息。

这里是详细信息。程序编译成功:

javac -classpath poi-3.10.1/*;poi-3.10.1/ooxml-lib/*;commons-io-2.4/*;commons-lang3-3.3.2/*;guava-libaries/*;MigLayout-4.0/*;.  reviewReport.java

程序成功运行:

java -classpath poi-3.10.1/*;poi-3.10.1/ooxml-lib/*;commons-io-2.4/*;commons-lang3-3.3.2/*;guava-libaries/*;MigLayout-4.0/*;. reviewReport

我设置了这个 list 文件:

Manifest-Version: 1.0
Class-Path: poi-3.10.1/*;poi-3.10.1/ooxml-lib/*;commons-io-2.4/*;commons-lang3-3.3.2/*;guava-libaries/*;MigLayout-4.0/*;.
Main-Class: reviewReport

( list 文件底部有一个空行)

成功创建 jar:

jar cfm reviewReport.jar manifest.mf *.class

我尝试使用以下命令从 jar 运行程序:

java -classpath poi-3.10.1/*;poi-3.10.1/ooxml-lib/*;commons-io-2.4/*;commons-lang3-3.3.2/*;guava-libaries/*;MigLayout-4.0/*;.  -jar reviewReport.jar

但是我没有运行,而是收到了这些错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: org.apache.poi.openxm
l4j.exceptions.InvalidFormatException
at java.lang.J9VMInternals.prepareClassImpl(Native Method)
at java.lang.J9VMInternals.prepare(J9VMInternals.java:430)
at java.lang.Class.getMethod(Class.java:1061)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:506)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:498)
Caused by: java.lang.ClassNotFoundException: org.apache.poi.openxml4j.exceptions
.InvalidFormatException
at java.net.URLClassLoader.findClass(URLClassLoader.java:665)
at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:942)
at java.lang.ClassLoader.loadClass(ClassLoader.java:851)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:827)
... 5 more

当我在构建 jar 时使用相同的类路径时,我试图了解是什么原因导致我可以自行运行的程序无法从 jar 运行。在研究之后,问题似乎是由于以下两件事之一造成的:(1) 尝试在实际上是 XLSX 或 DOCX 的文件上使用处理 XLS 和 DOC 文件的 POI 代码(反之亦然),或 (2)类加载器在运行时未找到 InvalidFormatException 类。

我已经研究了这两个潜在问题。对于 (1),我的程序处理 XLS 电子表格。我已经浏览了代码,我相信我总是正确地使用 POI 中的 HSSF 类。然后我的程序创建一个 DOCX word 文档。我已经检查了代码,我相信它总是正确地使用 XWPF 类。

对于 (2),当我使用在 http://www.ibm.com/developerworks/java/library/j-dclp1/index.html 的文章中讨论的冗长类功能时,运行程序的命令是:

java -Dibm.cl.verbose=org.apache.poi.openxml4j.exceptions.InvalidFormatException -classpath poi-3.10.1/*;poi-3.10.1/ooxml-lib/*;commons-io-2.4/*;commons-lang3-3.3.2/*;guava-libaries/*;MigLayout-4.0/*;.  reviewSearchReport

系统显示类加载器如何在不同位置搜索该类。它以这个成功的语句结束:

AppClassLoader found org/apache/poi/openxml4j/exceptions/InvalidFormatException.
class in \poi-3.10.1\poi-ooxml-3.10.1-20140818.jar

AppClassLoader found org.apache.poi.openxml4j.exceptions.InvalidFormatException

但是当我从 jar 运行它时,我得到了不同的结果。命令

java -Dibm.cl.verbose=org.apache.poi.openxml4j.exceptions.InvalidFormatException -classpath poi-3.10.1/*;poi-3.10.1/ooxml-lib/*;commons-io-2.4/*;commons-lang3-3.3.2/*;guava-libaries/*;MigLayout-4.0/*;.  -jar reviewReport.jar

下面是显示的内容:

AppClassLoader attempting to find org.apache.poi.openxml4j.exceptions.InvalidFor
matException

AppClassLoader using classpath C:\reviewReport.jar

AppClassLoader could not find org/apache/poi/openxml4j/exceptions/InvalidFormatE
xception.class in C:\reviewReport.jar

AppClassLoader could not find org.apache.poi.openxml4j.exceptions.InvalidFormatE
xception

有人能给我指出正确的方向吗?我这里有类加载器问题还是我程序中的代码不正确的 POI(例如在 DOC 文件上使用 DOCX 的类,或者在 XLS 文件上使用 XLSX 的类)?

最佳答案

是的,Gagravarr,我发现 jar 命令不使用“-classpath”参数(尽管如果将它包含在命令行中则不会出现错误)。

更重要的是,manifest.mf 文件的类路径部分使用空格来分隔项目,而不是在使用“-classpath”参数时使用分号(“;”)来分隔项目javac 语句。

我更改了我的 manifest.mf 文件以分隔类路径部分中的项目,我还专门列出了 jar,而不是依赖于“poi-3.10.1/*”通配符格式。

关于java - 使用 Apache.POI 并仅在从 JAR 文件运行时收到错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26722623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com