我无法正确导入所有必需的 .jar 文件。 我的最终目标只是读取 Excel 电子表格(更具体地说是 .xlsx 文件)来检查 Apache POI 的速度是否适合 future 的应用程序。
我的问题是为什么我会抛出错误...
java.lang.NoClassDefFoundError: org/apache/poi/openxml4j/exceptions/InvalidFormatException
...当我可以在“文件 poi-ooxml-3.9-20121203.jar”中的/org/apache/poi/openxml4j/exceptions/的类 InvalidFormatException 中看到时?
我已经有一段时间没有用 Java 编程了,我希望自己能够清醒地意识到我犯了一个愚蠢的错误。我的代码似乎编译正确,但当我尝试运行该程序时出现上述错误消息。我对我的问题做了一些研究,但找不到适合我的情况的人。他们通常只是忘记/没有所需的 .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
这是上面类路径的目录列表:
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
应该可以正常工作。请注意在类路径中添加当前目录,以便“java”找到您的类(在本例中为 TestExcel)。
或者,您可以使用 Java 检查的 CLASSPATH
envvar 对环境变量做一些有点棘手的事情,例如
export CLASSPATH=.:`ls -1d --color=no /home/robsco/Webdev/java/poi/* | xargs echo | sed 's/ /\:/g'`
javac TestExcel.java
java TestExcel
关于excel - 使用 Apache POI 打开 .xlsx 文件会出现 NoClassDefFoundError InvalidFormatException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33520316/