使用Apache POI打开.xlsx文件会导致出现NoClassDefFoundError InvalidFormatExceptionexception

我无法正确导入所有必需的.jar文件。 我的最终目标是简单地阅读一个Excel电子表格(更具体的是.xlsx文件)来检查Apache POI的速度是否适用于未来的应用程序。

我的问题是为什么我会抛出错误…

java.lang.NoClassDefFoundError:org / apache / poi / openxml4j / exceptions / InvalidFormatException

…当我可以在类文件poi-ooxml-3.9-20121203.jar中的/ org / apache / poi / openxml4j / exceptions /中看到类InvalidFormatException?

我有一段时间没有用Java编程,我希望自己的理智,我犯了一个愚蠢的错误。 我的代码似乎编译正确,但我有上面的错误信息,当我尝试运行该程序。 我已经对我的问题做了一些研究,但在我的情况下一直没能find一个人。 他们通常只是忘记/没有必需的.jar文件。 也许我在同一条船上,但希望你能告诉我。

我将分解我的逻辑。 这里是TestExcel.java中的代码

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; public class TestExcel { public static void main(String[] args) { InputStream inp; try { inp = new FileInputStream("cost.xlsx"); Workbook wb; try { wb = WorkbookFactory.create(inp); } catch (FileNotFoundException e) { e.printStackTrace(); } } catch (InvalidFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 

这里是用于编译和运行java代码的文件'c_test':

 javac -classpath "/home/robsco/Webdev/java/poi/*" TestExcel.java java TestExcel 

这是上面的类path的目录列表:

 robsco@roblaptop:~/Webdev/java/poi$ ls -al total 26616 drwxrwxr-x 2 robsco robsco 4096 Aug 18 18:13 . drwxrwxr-x 6 robsco robsco 4096 Aug 18 18:12 .. -rwxr-xr-- 1 robsco robsco 52915 Sep 18 2009 commons-logging-1.1.jar -rwxr-xr-- 1 robsco robsco 313898 Apr 5 2009 dom4j-1.6.1.jar -rwxr-xr-- 1 robsco robsco 121070 Apr 5 2009 junit-3.8.1.jar -rwxr-xr-- 1 robsco robsco 358180 Apr 5 2009 log4j-1.2.13.jar -rwxrw-r-- 1 robsco robsco 14841622 Aug 18 13:15 ooxml-schemas-1.1.jar -rwxr-xr-- 1 robsco robsco 1869113 Nov 26 2012 poi-3.9-20121203.jar -rwxr-xr-- 1 robsco robsco 30446 Nov 26 2012 poi-excelant-3.9-20121203.jar -rwxr-xr-- 1 robsco robsco 936648 Nov 26 2012 poi-ooxml-3.9-20121203.jar -rwxr-xr-- 1 robsco robsco 4802621 Nov 26 2012 poi-ooxml-schemas-3.9-20121203.jar -rwxr-xr-- 1 robsco robsco 1226511 Nov 26 2012 poi-scratchpad-3.9-20121203.jar -rwxr-xr-- 1 robsco robsco 2666695 Apr 5 2009 xmlbeans-2.3.0.jar 

和执行'c_test'的输出:

 robsco@roblaptop:~/Webdev/java$ ./c_test Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/openxml4j/exceptions/InvalidFormatException at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2521) at java.lang.Class.getMethod0(Class.java:2764) at java.lang.Class.getMethod(Class.java:1653) at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) Caused by: java.lang.ClassNotFoundException: org.apache.poi.openxml4j.exceptions.InvalidFormatException at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 6 more 

我在用:
操作系统:Lubuntu 12.10 x86

 java -version java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) robsco@roblaptop:~/Webdev/java/poi$ javac -version javac 1.7.0_25 

问题在于你如何启动你的程序。 我看到你目前有一个shell脚本:

 javac -classpath "/home/robsco/Webdev/java/poi/*" TestExcel.java java TestExcel 

这与所有的jar子编译,但不与他们运行,所以你的程序将不会有其依赖项。 (与一些c程序不同的是,使用Java编译不会内嵌压缩文件,也不会添加到文件的本地链接,如果你真的需要的话,有些工具可以帮你实现)

如果您将shell脚本更改为:

 javac -classpath "/home/robsco/Webdev/java/poi/*" TestExcel.java java -classpath ".:/home/robsco/Webdev/java/poi/*" TestExcel 

它应该工作正常。 注意在类path中添加当前目录以便'java'find你的类(在这种情况下是TestExcel)。

或者,你可以使用Java检查的CLASSPATH环境variables对环境variables做一些小事,例如

 export CLASSPATH=.:`ls -1d --color=no /home/robsco/Webdev/java/poi/* | xargs echo | sed 's/ /\:/g'` javac TestExcel.java java TestExcel