3

我正在运行一个shell脚本,它调用一个java类来从数据库获取一些数据,并用这些数据创建一个excel报告。我得到了线程错误异常“主要” java.lang.NoClassDefFoundError:组织/阿帕奇/ POI/SS时的代码打在我的Java类下面的线/的usermodel /工作簿:NoClassDefFoundError org/apache/poi/ss/usermodel/Workbook

XSSFWorkbook workbook = new XSSFWorkbook(); 

这是怎么了我定义类路径:

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

我验证了的罐子已经被下载(通过gradle这个),所以想了解我是什么在这里失踪。有人可以帮助我吗?

堆栈跟踪:

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 
+0

你为什么不使用摇篮建立一个可执行的JAR文件?我不认为shell脚本需要给你的类路径 –

回答

2

this Apache POI FAQ entry,混合不同版本之间POI罐子不支持并会在各种各样的方式,比如你已经找到了一个突破。 不要这样做!

你需要在同一个版本中使用你的POI罐子。我建议the latest version, available here(目前3.15)

你也许也应该查看components and their dependencies page,以确保你已经得到所有必需的罐子使用Apache POI。那么,或者使用像Maven或Gradle这样的依赖管理工具来为你处理!

+0

使用相同版本的poi工作...非常感谢! – user1318369

0

POI 2.5.1没有这样的包(以及因此类)包括(您可以通过拆包jar文件验证,因为他们基本上是zip档案)。请参阅source

将poi依赖项更新为release 3.这还具有匹配ooxml版本的附加好处。

0

我已经下载了最新的Apache POI二进制文件v3.17 here,它具有创建xlsx文件所需的所有jar文件,并且无需大惊小怪地打开。

所需的罐子显示在下面的屏幕截图(参考选定的罐子)FYR。

Main Jars

Supported Jars

Supported Jars