web-dev-qa-db-fra.com

NoClassDefFoundError org/Apache/poi/ss/usermodel/Workbook

J'exécute un script Shell qui appelle une classe Java pour obtenir des données de la base de données et créer un rapport Excel avec ces données. Je reçois l'erreur Exception dans le fil "principal" Java.lang.NoClassDefFoundError: org/Apache/poi/ss/usermodel/Workbook lorsque le code atteint la ligne ci-dessous dans ma classe Java:

XSSFWorkbook  workbook = new XSSFWorkbook ();

Voici comment j'ai défini le classpath:

CLASSPATH=${CLASSPATH}:<path-to-jars>/poi-2.5.1-final-20040804.jar
CLASSPATH=${CLASSPATH}:<path-to-jars>/poi-ooxml-3.11.jar

J'ai vérifié que les pots avaient été téléchargés (via gradle), essayant donc de comprendre ce qui me manque ici. Quelqu'un pourrait m'aider avec ça?

Trace de la pile:

    Exception in thread "main" Java.lang.NoClassDefFoundError: org/Apache/poi/ss/usermodel/Workbook
        at Java.lang.ClassLoader.defineClass1(Native Method)
        at Java.lang.ClassLoader.defineClass(ClassLoader.Java:800)
        at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:142)
        at Java.net.URLClassLoader.defineClass(URLClassLoader.Java:449)
        at Java.net.URLClassLoader.access$100(URLClassLoader.Java:71)
        at Java.net.URLClassLoader$1.run(URLClassLoader.Java:361)
        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:425)
        at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:308)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:358)
        at com.test.ExcelReportGenerator.writeExcel(ExcelReportGenerator.Java:26)
        at com.test.ReportRunner.createReport(ReportRunner.Java:109)
        at com.test.ReportRunner.main(ReportRunner.Java:93)
Caused by: Java.lang.ClassNotFoundException: org.Apache.poi.ss.usermodel.Workbook
        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:425)
        at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:308)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:358)
        ... 15 more
3
user1318369

Selon ce POI Apache FAQ entrée , mélanger des jars de POI entre différentes versions n'est pas pris en charge et se brisera de toutes sortes de manières, comme celle que vous avez trouvée. . Ne le fais pas!

Vous devez utiliser vos jarres de points d'intérêt à partir de la même version. Je suggérerais la dernière version, disponible ici (actuellement 3.15)

Vous devriez probablement également consulter la page components et leurs dépendances , afin de vous assurer que vous disposez de tous les fichiers JAR nécessaires à votre utilisation du POI Apache. Ou bien, utilisez un outil de gestion des dépendances tel que Maven ou Gradle pour gérer cela pour vous!

5
Gagravarr

J'ai téléchargé les derniers binaires Apache POI v3.17 ici et il contient tous les fichiers JAR nécessaires pour créer un fichier xlsx et l'ouvrir sans fioritures.

Les bocaux requis sont indiqués dans les captures d'écran ci-dessous (voir les bocaux sélectionnés). FYR.

 Main Jars

 Supported Jars

 Supported Jars

2
mannedear

poi 2.5.1 ne contenait aucun paquet de ce type (et par conséquent une classe) (vous pouvez vérifier en décompressant les fichiers jar car il s’agit essentiellement d’archives Zip). Voir la source .

Mettez à jour la dépendance poi vers la version 3. Cela présente également l'avantage de faire correspondre la version ooxml.

0
Ivan