OSGi独立运行时出现NoClassDefFoundError: org/xml/sax/helpers/DefaultHandler求助
问题:OSGi独立环境下FeatureExportOperation抛出NoClassDefFoundError: org/xml/sax/helpers/DefaultHandler
问题背景
开发了一个OSGi Bundle,通过代码创建FeatureExportOperation实现项目导出功能。该Bundle在Eclipse的OSGi HostConsole中运行正常,但在独立OSGi环境运行时,导出操作最后阶段抛出NoClassDefFoundError。
核心代码
public void createExportOperation(IProject project, IPath buildLocation, IPath exportLocation) throws CoreException{ try { FeatureExportInfo exportInfo = this.initExport(buildLocation, exportLocation, project); exportInfo.qualifier = AdvancedFeatureExportOperation.getDateQualifier(); Job job = new AdvancedFeatureExportOperation(exportInfo, "Project Deployment"); job.setUser(true); job.setRule(ResourcesPlugin.getWorkspace().getRoot()); job.schedule(); } catch (Exception exception) { exception.printStackTrace(); } }
注:AdvancedFeatureExportOperation是org.eclipse.pde.internal.core.exports.FeatureExportOperation的包装类
错误日志
!ENTRY org.eclipse.core.jobs 4 2 2022-09-22 20:24:07.425 !MESSAGE An internal error occurred during: "Project Deployment". !STACK 0 java.lang.NoClassDefFoundError: org/xml/sax/helpers/DefaultHandler at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClassHoldingLock(ClasspathManager.java:638) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:613) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:574) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:492) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:465) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216) at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:395) at org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(SingleSourcePackage.java:35) at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:461) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClassHoldingLock(ClasspathManager.java:638) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:613) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:574) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:492) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:465) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216) at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:395) at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:464) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at org.eclipse.pde.internal.build.site.BuildTimeFeatureFactory.parseBuildFeature(BuildTimeFeatureFactory.java:79) at org.eclipse.pde.internal.build.site.BuildTimeFeatureFactory.createFeature(BuildTimeFeatureFactory.java:50) at org.eclipse.pde.internal.build.site.BuildTimeSite.createFeature(BuildTimeSite.java:469) at org.eclipse.pde.internal.build.site.compatibility.FeatureReference.getFeature(FeatureReference.java:39) at org.eclipse.pde.internal.build.site.BuildTimeSite.resolveFeatureReferences(BuildTimeSite.java:327) at org.eclipse.pde.internal.build.site.BuildTimeSite.findFeature(BuildTimeSite.java:296) at org.eclipse.pde.internal.build.site.BuildTimeSite.findFeature(BuildTimeSite.java:288) at org.eclipse.pde.internal.build.BuildScriptGenerator.generateFeatures(BuildScriptGenerator.java:252) at org.eclipse.pde.internal.build.BuildScriptGenerator.generate(BuildScriptGenerator.java:127) at org.eclipse.pde.internal.core.exports.FeatureExportOperation.doExport(FeatureExportOperation.java:256) at org.eclipse.pde.internal.core.exports.FeatureExportOperation.doExport(FeatureExportOperation.java:223) at org.eclipse.pde.internal.core.exports.FeatureExportOperation.run(FeatureExportOperation.java:107) at com.iisy.solvatio.studio.deployment.wizards.AdvancedFeatureExportOperation.run(AdvancedFeatureExportOperation.java:24) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53) Caused by: java.lang.ClassNotFoundException: org.xml.sax.helpers.DefaultHandler cannot be found by org.eclipse.equinox.p2.publisher.eclipse_1.1.200.v20130516-1953 at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 45 more
已尝试的方案
- 安装与Eclipse中完全一致的Bundle,确保依赖满足
- 引入导出
org.xml.sax.helpers.DefaultHandler的org.everit.osgi.bundles.org.apache.xmlcommons.full-1.4.1-20150918.jar,并在自身Bundle的Manifest中添加Require-Bundle - 手动修改
org.eclipse.equinox.p2.publisher.eclipse的Manifest添加该依赖
排查思路与解决方案
1. 配置系统包导出
org.xml.sax.helpers.DefaultHandler属于JRE系统包,Eclipse自带OSGi环境默认已配置导出,但独立环境可能缺失:
- 修改OSGi框架的
config.ini文件,添加:org.osgi.framework.system.packages.extra=org.xml.sax,org.xml.sax.helpers - 或在启动OSGi框架时添加VM参数:
-Dorg.osgi.framework.system.packages.extra=org.xml.sax,org.xml.sax.helpers
2. 规范Bundle依赖声明
- 自身Bundle通过
Import-Package声明对org.xml.sax.helpers的依赖,替代仅依赖第三方XML包的Require-Bundle方式,确保类加载器能正确定位该类 - 避免手动修改第三方Bundle的Manifest,这种方式不可靠,框架更新时会丢失修改,应通过系统包导出让第三方Bundle自动访问该类
3. 验证XML Bundle状态
- 在OSGi控制台执行
ss命令,确认org.everit.osgi.bundles.org.apache.xmlcommons.full已处于ACTIVE状态 - 执行
headers <bundle-id>命令,检查该Bundle是否确实导出了org.xml.sax.helpers包
4. 用OSGi控制台诊断类加载问题
- 执行
packages org.xml.sax.helpers:查看哪个Bundle导出了该包 - 执行
bundle org.eclipse.equinox.p2.publisher.eclipse:检查该Bundle的导入包列表,确认是否包含org.xml.sax.helpers - 执行
class org.xml.sax.helpers.DefaultHandler:查看该类的加载来源,确认是系统类加载器还是第三方Bundle加载器
内容的提问来源于stack exchange,提问作者A. S.
相关产品推荐
相关产品推荐

