Java NoClassDefFoundError org/apache/poi/ss/usermodel/Workbook
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/40320849/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
NoClassDefFoundError org/apache/poi/ss/usermodel/Workbook
提问by user1318369
I am running a shell script which calls a java class to get some data from database and create an excel report with that data. I get the error Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Workbook when the code hits the below line in my java class:
我正在运行一个 shell 脚本,它调用一个 java 类从数据库中获取一些数据并使用该数据创建一个 excel 报告。当代码在我的 java 类中遇到以下行时,我在线程“main”java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Workbook 中收到错误异常:
XSSFWorkbook workbook = new XSSFWorkbook ();
This is how I have defined the classpath:
这就是我定义类路径的方式:
CLASSPATH=${CLASSPATH}:<path-to-jars>/poi-2.5.1-final-20040804.jar
CLASSPATH=${CLASSPATH}:<path-to-jars>/poi-ooxml-3.11.jar
I verified that the jars have been downloaded(via gradle), so trying to understand what am I missing here. Can someone please help me with this?
我验证了 jars 已经下载(通过 gradle),所以试图了解我在这里遗漏了什么。有人可以帮我解决这个问题吗?
Stacktrace:
堆栈跟踪:
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.access0(URLClassLoader.java:71)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.net.URLClassLoader.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.run(URLClassLoader.java:366)
at java.net.URLClassLoader.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
采纳答案by Gagravarr
As per this Apache POI FAQ entry, mixing POI jars between different versions is not supportedand will break in all sorts of ways, such as the one you've found. Don't do it!
根据这个 Apache POI 常见问题条目,不支持在不同版本之间混合 POI jars,并且会以各种方式破坏,例如您发现的那种。不要这样做!
You need to be using your POI jars all from the same release. I'd suggest the latest version, available here(currently 3.15)
您需要使用来自同一版本的所有 POI jar。我建议使用最新版本,可在此处获得(当前为 3.15)
You should probably also review the components and their dependencies page, to ensure you've got all the required jars for your use of Apache POI. Well, or use a dependency management tool like Maven or Gradle to handle that for you!
您可能还应该查看组件及其依赖项页面,以确保您拥有使用 Apache POI 所需的所有 jar。好吧,或者使用像 Maven 或 Gradle 这样的依赖管理工具来为您处理!
回答by Ivan
poi 2.5.1 had no such package (and consequently a class) included (you can verify by unpacking the jar files as they are essentially zip archives). See the source.
poi 2.5.1 没有包含这样的包(因此是一个类)(您可以通过解压缩 jar 文件来验证,因为它们本质上是 zip 存档)。见源码。
Update the poi dependency to release 3. This also has the added benefit of matching the ooxml version.
将 poi 依赖项更新为版本 3。这还具有匹配 ooxml 版本的额外好处。
回答by mannedear
I have downloaded the latest Apache POI binaries v3.17 hereand it has all the required jars to create xlsx file and open with out any fuss.
我已经在这里下载了最新的 Apache POI 二进制文件 v3.17 ,它具有创建 xlsx 文件所需的所有 jar 文件,并且可以毫不费力地打开。
Required jars are shown in below screenshots (refer to selected jars) FYR.
所需的罐子显示在下面的屏幕截图中(请参阅选定的罐子)FYR。
回答by user1416932
For apache poi to work, you need compatible jars. I used these jars
要使 apache poi 工作,您需要兼容的 jar。我用过这些罐子
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>openxml4j</artifactId>
<version>1.0-beta</version>
</dependency>