2013-08-18 135 views
2

我無法正確導入所有必需的.jar文件。 我的最終目標僅僅是讀取Excel電子表格(更具體地說.xlsx文件)來檢查Apache POI的速度是否適用於未來的應用程序。使用Apache POI打開.xlsx文件會導致NoClassDefFoundError InvalidFormatException

我的問題是,爲什麼我會得到拋出的錯誤...

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

...當我可以在/組織/阿帕奇/ POI/openxml4j /異常的類InvalidFormatException見/在'file poi-ooxml-3.9-20121203.jar'?

我在一段時間內沒有用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(); 
     } 
    } 
} 

這裏是文件「c_test」用來編譯和運行Java代碼:

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

下面是上面的類路徑的目錄列表:

[email protected]:~/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' 的輸出:

[email protected]:~/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 

我使用:
OS:Lubuntu 12.10 86

java -version 
java version "1.7.0_25" 
Java(TM) SE Runtime Environment (build 1.7.0_25-b15) 

[email protected]:~/Webdev/java/poi$ javac -version 
javac 1.7.0_25 
+1

你能或許也有你的classpath中一些較舊的POI罐子?請參閱[此POI常見問題解答條目以瞭解如何檢查](http://poi.apache.org/faq。html#faq-N10006) – Gagravarr

+0

感謝@Gagravarr的迴應。我試圖對常見問題的代碼,並增加了進口的POIFSFileSystem和URL類別,並獲得在運行時出現此錯誤:螺紋 '異常「主要」 java.lang.NoClassDefFoundError:組織/阿帕奇/ POI/POIFS /文件系統/ POIFSFileSystem \t at TestExcel.main(TestExcel.java:24)' 看來很奇怪,當我專門導入它並且poi jar在我的類路徑中時,它找不到那個類。 – robsco

+0

你的shell腳本出現在類路徑中傳遞的編譯器(javac)的步驟,但不運行(JAVA)的步驟,它可能是這麼簡單? – Gagravarr

回答

1

的問題是你如何啓動程序。我看你現在有一個shell腳本:

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

與所有的罐子編譯,但不與他們跑了,所以你的程序將不會有它的依賴可用。 (與一些c程序不同,使用Java編譯不會影響壓縮性,也不會添加本地鏈接到文件。如果您真的需要它,也可以使用這些工具)

如果更改你的shell腳本是:

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

它應該工作正常。注意在類路徑中添加當前目錄以便'java'找到你的類(在這種情況下是TestExcel)。

或者,你可以做的東西有點噁心與環境變量,使用CLASSPATH ENVVAR是Java的檢查,如

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