向Eclipse插件添加Jar包至类路径失败,报NoClassDefFoundError
如何正确将org.json.simple Jar包添加到Eclipse插件类路径?
问题描述
我正尝试将org.json.simple Jar包添加至一个Eclipse插件中。查阅资料后,我尝试了右键项目→Build Path→配置→库→添加外部Jar的操作,也试过使用“添加Jar”并将Jar包放在项目根目录或lib文件夹下,但均未生效。无论是在Eclipse中启动应用,还是导出后启动,都持续出现NoClassDefFoundError错误(启动画面不显示为另一独立问题)。我目前的临时解决方案是将该Jar包的源码制作成插件并添加到我的feature中。
错误日志
!SESSION 2024-09-01 13:58:16.796 ----------------------------------------------- eclipse.buildId=unknown java.version=1.8.0_421 java.vendor=Oracle Corporation BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US Framework arguments: -product tcmagic.ui.product -clearPersistedState Command-line arguments: -product tcmagic.ui.product -data C:\Users\Danny\Downloads\EclipseRcpPluginDev\Neon3\workspace11/../runtime-tcmagic.product -dev file:C:/Users/Danny/Downloads/EclipseRcpPluginDev/Neon3/workspace11/.metadata/.plugins/org.eclipse.pde.core/tcmagic.product/dev.properties -os win32 -ws win32 -arch x86_64 -consoleLog -clearPersistedState -data @noDefault !ENTRY org.eclipse.osgi 4 0 2024-09-01 13:58:20.829 !MESSAGE Application error !STACK 1 org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.NoClassDefFoundError: org/json/simple/parser/ParseException) at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:65) at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:259) at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:107) at org.eclipse.e4.ui.internal.workbench.swt.E4Application.lambda$0(E4Application.java:238) at java.util.Optional.ifPresent(Unknown Source) at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createE4Workbench(E4Application.java:234) at org.eclipse.e4.ui.internal.workbench.swt.E4Application.start(E4Application.java:148) 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:388) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) at org.eclipse.equinox.launcher.Main.run(Main.java:1519) at org.eclipse.equinox.launcher.Main.main(Main.java:1492) Caused by: org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.NoClassDefFoundError: org/json/simple/parser/ParseException) at org.eclipse.swt.SWT.error(SWT.java:4533) at org.eclipse.swt.SWT.error(SWT.java:4448) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827) at tcmagic.ui.Splash.prompt(Splash.java:119) at tcmagic.ui.LifeCycle.postContextCreate(LifeCycle.java:25) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) ... 20 more Caused by: java.lang.NoClassDefFoundError: org/json/simple/parser/ParseException at tcmagic.db.mtgjson.Mtgjson.getSetListFile(Mtgjson.java:102) at tcmagic.db.mtgjson.Mtgjson.getSetLists(Mtgjson.java:110) at tcmagic.db.Database.createCards(Database.java:41) at tcmagic.ui.Splash.run(Splash.java:51) at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) ... 29 more Caused by: java.lang.ClassNotFoundException: org.json.simple.parser.ParseException cannot be found by tcmagic.db_1.0.0.qualifier at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:461) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) at java.lang.ClassLoader.loadClass(Unknown Source) ... 35 more An error has occurred. See the log file C:\Users\Danny\Downloads\EclipseRcpPluginDev\Neon3\workspace11\.metadata\.plugins\org.eclipse.pde.core\tcmagic.product\1725217097207.log.
解决方案
方法1:将Jar包嵌入到插件中(推荐)
- 在插件项目内创建
lib文件夹,把org.json.simple.jar复制进去 - 右键插件项目 → PDE Tools → Open Manifest Editor(打开
MANIFEST.MF文件) - 切换到Runtime标签页,在Classpath区域点击Add,选择
lib/org.json.simple.jar添加 - 切换到Build标签页,在Binary Build区域勾选
lib文件夹及其中的Jar包,确保构建时包含该文件 - 保存
MANIFEST.MF,重新构建插件项目后测试
方法2:将Jar包转换为独立OSGi插件(适合多项目复用)
- 打开File → New → Project → Plug-in from existing JAR archives
- 选择org.json.simple.jar,按照向导完成OSGi插件的创建
- 在目标插件的
MANIFEST.MF的Dependencies标签页,添加这个新插件的依赖 - 更新feature和product配置,确保包含该新插件
配置验证要点
- 检查
MANIFEST.MF的Bundle-ClassPath是否包含lib/org.json.simple.jar(方法1) - 确认插件依赖列表已正确添加对应的OSGi插件(方法2)
- 重启PDE应用,验证
NoClassDefFoundError是否消失
内容的提问来源于stack exchange,提问作者Daniel Vaughn
相关产品推荐
相关产品推荐

