导出Eclipse插件Jar替换后出现NoClassDefFoundError问题求助
问题:Eclipse插件替换后出现NoClassDefFoundError
问题背景
- 基于
org.eclipse.ltk.ui.refactoring插件源码开发,添加了语句:DebugPlugin debugPlugin = DebugPlugin.getDefault(); - 由于
DebugPlugin位于org.eclipse.debug.core插件中,已在MANIFEST.MF的Require-Bundle最后一行添加配置:org.eclipse.debug.core;bundle-version="3.18.300" - 本地通过Eclipse插件运行方式启动一切正常,但导出
org.eclipse.ltk.ui.refactoring_3.12.0.v20210618-1953.jar并替换到包含300+插件的已安装Eclipse后,触发操作时立即抛出java.lang.NoClassDefFoundError
错误栈信息
!ENTRY org.eclipse.ui 4 0 2023-01-30 11:34:48.086 !MESSAGE Unhandled event loop exception !STACK 0 java.lang.NoClassDefFoundError: org/eclipse/debug/core/DebugPlugin at org.eclipse.ltk.ui.refactoring.resource.RenameResourceWizard$RenameResourceRefactoringConfigurationPage.saveSettings(RenameResourceWizard.java:162) at org.eclipse.ltk.ui.refactoring.resource.RenameResourceWizard$RenameResourceRefactoringConfigurationPage.performFinish(RenameResourceWizard.java:155) at org.eclipse.ltk.ui.refactoring.RefactoringWizard.performFinish(RefactoringWizard.java:710) at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.okPressed(RefactoringWizardDialog2.java:450) at org.eclipse.jface.dialogs.Dialog.buttonPressed(Dialog.java:468) at org.eclipse.jface.dialogs.Dialog.lambda$0(Dialog.java:619) at org.eclipse.swt.events.SelectionListener$1.widgetSelected(SelectionListener.java:84) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:252) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5895) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1515) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:5126) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4581) at org.eclipse.jface.window.Window.runEventLoop(Window.java:823) at org.eclipse.jface.window.Window.open(Window.java:799) at org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation.lambda$0(RefactoringWizardOpenOperation.java:190) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:74) at org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation.run(RefactoringWizardOpenOperation.java:209) at org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation.run(RefactoringWizardOpenOperation.java:126) at org.eclipse.cdt.internal.ui.refactoring.RefactoringStarter.activate(RefactoringStarter.java:36) at org.eclipse.cdt.internal.ui.refactoring.rename.RenameSupport.openRenameResourceDialog(RenameSupport.java:262) at org.eclipse.cdt.internal.ui.refactoring.rename.RenameSupport.openRenameResourceDialog(RenameSupport.java:239) at org.eclipse.cdt.internal.ui.refactoring.rename.CRefactory.renameResource(CRefactory.java:109) at org.eclipse.cdt.internal.ui.navigator.CNavigatorRenameResourceAction.run(CNavigatorRenameResourceAction.java:46) at org.eclipse.ui.actions.BaseSelectionListenerAction.runWithEvent(BaseSelectionListenerAction.java:171) at org.eclipse.jface.commands.ActionHandler.execute(ActionHandler.java:121) at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:97) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:317) at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:251) at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:173) at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:156) at org.eclipse.core.commands.Command.executeWithChecks(Command.java:488) at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:487) at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:213) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:308) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:580) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:647) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:439) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:96) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1937) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1514) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1541) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1524) at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1563) at org.eclipse.swt.widgets.Widget.gtk_key_press_event(Widget.java:924) at org.eclipse.swt.widgets.Control.gtk_key_press_event(Control.java:3992) at org.eclipse.swt.widgets.Composite.gtk_key_press_event(Composite.java:921) at org.eclipse.swt.widgets.Tree.gtk_key_press_event(Tree.java:2369) at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:2408) at org.eclipse.swt.widgets.Control.windowProc(Control.java:6833) at org.eclipse.swt.widgets.Tree.windowProc(Tree.java:4237) at org.eclipse.swt.widgets.Display.windowProc(Display.java:6197) at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_do_event(Native Method) at org.eclipse.swt.widgets.Display.eventProc(Display.java:1565) at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_iteration_do(Native Method) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4578) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1154) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1045) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155) at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:644) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:551) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:156) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:133) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:596) at org.eclipse.equinox.launcher.Main.run(Main.java:1467) at org.eclipse.equinox.launcher.Main.main(Main.java:1440) Caused by: java.lang.ClassNotFoundException: org.eclipse.debug.core.DebugPlugin cannot be found by org.eclipse.ltk.ui.refactoring_3.12.0.v20210618-1953 at org.eclipse.osgi.internal.loader.BundleLoader.generateException(BundleLoader.java:516) at org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:511) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:403) at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:168) at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ... 84 more
已尝试操作
- 搭建了引用外部Jar类的小型测试项目,设置类路径后问题解决,但给Eclipse插件设置类路径无效
解决思路
1. 检查目标环境的依赖插件状态
- 确认目标Eclipse中
org.eclipse.debug.core插件是否存在,且版本不低于3.18.300,版本不匹配会导致依赖无法解析 - 查看目标Eclipse的插件目录,确认
org.eclipse.debug.core未被禁用(可通过Help > About Eclipse IDE > Installation Details > Installed Software检查)
2. 验证导出插件的MANIFEST.MF配置
- 解压导出的
org.eclipse.ltk.ui.refactoring_3.12.0.v20210618-1953.jar,查看其中的MANIFEST.MF文件,确认Require-Bundle中确实包含org.eclipse.debug.core;bundle-version="3.18.300",避免导出过程中配置丢失
3. 使用OSGi控制台排查依赖问题
- 启动目标Eclipse时添加
-console参数,打开OSGi控制台 - 执行
ss org.eclipse.ltk.ui.refactoring查看插件状态,确认是否处于ACTIVE状态 - 执行
diag org.eclipse.ltk.ui.refactoring命令,获取依赖解析的详细错误信息,定位具体问题
4. 调整依赖的可选性与加载策略
- 如果
org.eclipse.debug.core并非强制依赖,可在Require-Bundle中添加resolution:=optional,配置变为org.eclipse.debug.core;bundle-version="3.18.300";resolution:=optional,同时代码中需处理DebugPlugin.getDefault()返回null的情况 - 确认
org.eclipse.debug.core的启动级别,确保在org.eclipse.ltk.ui.refactoring需要时已被加载(可通过Window > Preferences > Plug-in Development > Target Platform查看目标平台的插件启动配置)
5. 避免插件版本冲突
- 目标Eclipse中已有同名插件,替换时需完全覆盖旧版本的插件文件,或通过更新站点的方式安装修改后的插件,防止OSGi加载未添加新依赖的旧版本插件
内容的提问来源于stack exchange,提问作者Ars
相关产品推荐
相关产品推荐

