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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:50:34