2017-05-26 140 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

你是偉大的人。謝謝 !。 –