【问题标题】:java.lang.NoClassDefFoundError: org/apache/poi/xssf/usermodel/XSSFWorkbookjava.lang.NoClassDefFoundError: org/apache/poi/xssf/usermodel/XSSFWorkbook
【发布时间】:2017-10-26 21:26:31
【问题描述】:

我遇到了这个异常,但我无法理解那里发生了什么。

因为在编译时我的类能够访问 apache POI 类,但在运行时我的类抛出他无法找到的异常

org.apache.poi.xssf.usermodel.XSSFWorkbook

到目前为止,无论网上提供什么解决方案,我都尝试了所有方法,但不明白我缺少什么。

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

我检查了我引用库的所有文件夹的访问权限。

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

我收到以下异常。

!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

【问题讨论】:

  • 类路径中缺少 POI jar 文件。
  • 在 Eclipse 中通过使用构建路径我添加了 POI jar。如果没有 POI jar,则此异常表明 eclipse 如何允许我访问“XSSFWorkbook”类。在我的代码中。因为我没有任何编译错误。
  • 这是一个运行时错误,所以运行时类路径是错误的,而不是构建路径。见stackoverflow.com/questions/2520821/…
  • 我在同一个工作空间内创建了一个测试项目。在那个项目中,我添加了一个使用 POI 类的简单类。我从同一个位置构建相同的罐子,但它们正在运行......你仍然认为这是同一个问题......你上面提到的。 ?
  • 这是您正在编写的 Eclipse 插件吗?插件有特殊的类路径要求,只设置构建路径属性是不正确的。

标签: java eclipse eclipse-plugin apache-poi eclipse-emf


【解决方案1】:

插件只能访问其他插件或插件中包含的 jar 中的类,这些 jar 包含在 bundle 类路径中。设置 Java 构建路径属性不会正确配置插件。

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

更新 build.properties 以将这些 jars 包含在“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 个 jars(这些不是 POI jars,这只是我的一个项目中的一个示例)。

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

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

【讨论】:

  • 感谢您的宝贵时间。我做了第一步。在第二步“类路径”部分中的“运行时”选项卡中,这些条目将如何到达那里。我可以通过编写所有库名称来直接手动编辑 MANIFEST.MF 文件吗?
  • 点击Classpath列表右侧的Add...按钮,选择插件中的jar,也可以直接编辑MANIFEST.MF。
  • 你认为这里的问题标题需要改变吗?因为将来如果有人遇到同样的问题,他可以节省时间。
  • 我觉得标题还可以
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2011-09-21
  • 2019-05-27
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多