You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:40:57