2017-05-26 92 views
0

我收到了这个异常,但我无法理解那里发生了什么。java.lang.NoClassDefFoundError:org/apache/poi/xssf/usermodel/XSSFWorkbook

因为在编译时我的课能访问的Apache POI类,但在运行时我的班抛出异常,他是不是能够找到

org.apache.poi.xssf.usermodel.XSSFWorkbook

直到现在无论在网上提供的解决方案,我已经尝试了一切,但没有理解我失踪。

奇怪的事情是相同的代码和相同的Apache POI库在我的朋友的日食工作。我们都有相同的项目。不明白那里发生了什么。

我检查了所有文件夹的访问,我指的是库。

请分享,如果您有任何建议。

我收到以下异常。

!MESSAGE Unhandled event loop exception 
!STACK 0 
java.lang.NoClassDefFoundError: org/apache/poi/xssf/usermodel/XSSFWorkbook 
    at com.herzog.pmide.mergedconfigxml.ui.editors.DocumentGenerator.prepareScadaIOListExcel(DocumentGenerator.java:94) 
    at com.herzog.pmide.mergedconfigxml.ui.editors.DocumentGenerator.scadaIOList(DocumentGenerator.java:77) 
    at com.herzog.pmide.mergedconfigxml.ui.actions.DocumentGeneratorAction.run(DocumentGeneratorAction.java:47) 
    at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:253) 
    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595) 
    at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:511) 
    at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:420) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) 
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:331) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) 
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) 
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:331) 
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) 
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) 
    at com.herzog.pmide.application.Application.start(Application.java:20) 
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1465) 
    at org.eclipse.equinox.launcher.Main.main(Main.java:1438) 
Caused by: java.lang.ClassNotFoundException: org.apache.poi.xssf.usermodel.XSSFWorkbook cannot be found by com.herzog.pmide.mergedconfigxml.ui_1.0.0.qualifier 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:432) 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:345) 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:337) 
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:160) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

MANIFEST.MF作为遵循

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: Ui 
Bundle-SymbolicName: com.herzog.pmide.mergedconfigxml.ui;singleton:=true 
Bundle-Version: 1.0.0.qualifier 
Bundle-Activator: com.herzog.pmide.mergedconfigxml.ui.Activator 
Bundle-Vendor: Example 
Require-Bundle: org.eclipse.ui, 
org.eclipse.core.runtime, 
org.eclipse.core.resources, 
org.eclipse.emf.ecore.xmi, 
org.eclipse.emf.edit.ui, 
com.herzog.pmide.machinelib.model.edit, 
org.eclipse.ui.forms, 
org.eclipse.ui.workbench, 
org.eclipse.ui.ide, 
com.herzog.pmide.mergedconfigxml.model.edit, 
org.eclipse.gef, 
com.herzog.pmide.tools.importutility, 
com.herzog.pmide.machinelib.model, 
org.eclipse.swt, 
org.eclipse.emf.query, 
com.herzog.pmide.mergedconfigxml.model, 
org.eclipse.ui.editors, 
org.eclipse.emf.validation, 
org.eclipse.emf.validation.ui, 
org.slf4j.api, 
org.junit, 
org.eclipse.emf.compare, 
org.eclipse.emf.compare.edit, 
org.eclipse.emf.compare.ide.ui, 
org.eclipse.compare, 
org.apache.commons.io, 
org.eclipse.core.filesystem, 
de.vonloesch.pdf4Eclipse, 
de.vonloesch.pdf4eclipse.help, 
com.herzog.pmide.routingline.model 
Bundle-ActivationPolicy: lazy 
Bundle-ClassPath: . 
Export-Package: com.herzog.pmide.mergedconfigxml.ui, 
com.herzog.pmide.mergedconfigxml.ui.editors.unitconfig, 
com.herzog.pmide.mergedconfigxml.ui.views 
Bundle-Localization: OSGI-INF/l10n/message 

build.properties作为遵循

source.. = src/ 
output.. = bin/ 
bin.includes = META-INF/,\ 
       .,\ 
       plugin.xml,\ 
       icons/,\ 
       OSGI-INF/l10n/message.properties 
+2

您的类路径中缺少POI jar文件。 – Andreas

+0

在eclipse中使用构建路径我添加了POI jar。如果没有POI jar,那么这个例外就是建议eclipse如何让我访问“XSSFWorkbook”类。在我的代码中。因为我没有任何编译错误。 –

+1

这是一个运行时错误,所以运行时类路径是错误的,而不是构建路径。请参阅https://stackoverflow.com/questions/2520821/java-problem-with-the-classpath-on-eclipse。 –

回答

3

一个插件只能在其他插件或在包括在插件罐子接入类别被包括在bundle类路径中。设置Java Build Path属性不会正确配置插件。

将所有需要的jar添加到插件中,通常这些放在'lib'目录中。

更新build.properties以在'bin.includes'部分包含这些罐子。例如:

source.. = src/ 
output.. = bin/ 
bin.includes = META-INF/,\ 
       .,\ 
       plugin.properties,\ 
       plugin.xml,\ 
       lib/,\ 
       lib/jogg-0.0.7.jar,\ 
       lib/jorbis-0.0.15.jar,\ 
       lib/vorbisspi1.0.2.jar 

在这里我有一个lib目录3罐(这些都不是POI罐子,这只是从我的一个项目为例)。

更新MANIFEST.MF并设置Bundle-Classpath以包括罐子。您可以在'Classpath'部分的'Runtime'选项卡的MANIFEST.MF编辑器中执行此操作(使用列表右侧的Add ...按钮并选择插件中的库)。一定要保留'。'的条目。您的MANIFEST.MF最终应该包含如下所示的“Bundle-Classpath”条目:

Bundle-ClassPath: ., 
lib/jogg-0.0.7.jar, 
lib/jorbis-0.0.15.jar, 
lib/vorbisspi1.0.2.jar 
+0

感谢您的时间。我做了第一步。在'Classpath'部分的''Runtime'选项卡的第二步中'如何输入这些条目。我可以通过编写所有库名直接手动编辑MANIFEST.MF文件吗? –

+1

单击Classpath列表右侧的Add ...按钮并选择插件中的JAR,或者直接编辑MANIFEST.MF。 –

+0

你是伟大的人。谢谢 !。 –