POIでNoClassDefFoundError

POIのライブラリのバージョンを上げる作業をしました。

今までxls形式を扱っていたため古いバージョンでも動いていたのですが、今度はxlsxを扱う必要がでてきたためです。

xlsx形式は、確かPOI 3.5くらいから対応していたと思います。

 

バージョンを上げるにあたって、POI関連のjarファイルを差し替える必要があります。

具体的には、以下のjarファイルたちです。

poi-3.X-YYYYMMDD.jar
poi-excelant-3.X-YYYYMMDD.jar
poi-ooxml-3.X-YYYYMMDD.jar
poi-scratchpad-3.X-YYYYMMDD.jar

これらのjarファイル差し替えに加え、HSSFWorkbookを始めとする「HSSF」系のクラスを一通りXSSFWorkbookのような「XSSF」系のクラスに置き換えました。

その他もろもろ、コンパイルエラー部分を修正していき、最後に、読み込ませていたテンプレートファイルのxlsをxlsx形式に変換しました。

 

動かしてみると以下のエラーが発生…

java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTSheet

NoClassDefFoundErrorはたまに見かけますが、たいていはアプリケーションサーバ側の設定が不足しているといった他の原因である場合が多かったです。

とりあえず、エラー文で調べてみると以下の記事がヒット。

JavaXp.com | Java Experts Blog | Java Examples | API | Errors | Exceptions: Java : Read / Write Excel file (.xls or .xlsx) using Apache POI

Exception in thread "main" java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTSheet
at com.test.TestExcel.writeXLSXFile(TestExcel.java:135)
at com.test.TestExcel.main(TestExcel.java:165)
Caused by: java.lang.ClassNotFoundException: org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 2 more

Solution: Add poi-ooxml-schemas-3.8-20120326.jar in classpath

どうやらpoi-ooxml-schemas-3.X-YYYYMMDD.jarが無いのが原因だったようです。

該当バージョンのjarファイルを探してライブラリに追加したところエラーが変わり、dom4j-1.6.1.jarも追加することでようやく解消しました。これも記事に記載されています。

 

「NoClassDefFoundError」は本来、クラス定義が見つからない場合に発生するエラーです。今回は素直に受け止めてよかったようです。

ただ、何が見つからないといわれているのかが分からないエラー内容でした。