Eclipse产品导出失败:运行时出现ClassNotFoundException问题求助
Eclipse e4产品导出后ClassNotFoundException排查方案
问题背景
基于Eclipse e4的Java项目,包含40个插件、数千个类,IDE中运行完全正常,但导出独立运行产品后,主插件au.xxxxx.yyyy.one的Activator.start()调用au.xxxxx.yyyy.sysenv.Environment的静态方法时,抛出:
BundleException: ClassNotFoundException: au.xxxxx.yyyy.sysenv.Environment cannot be found by au.xxxxx.yyyy.one_1.0.0.202305301827
已确认的前置检查:
sysenv项目已导出Environment类one项目将sysenv列为必需插件sysenv项目的二进制构建包含该类- 导出后的sysenv jar包内存在该类
排查与解决思路
1. 校验插件依赖版本匹配
打开one插件的MANIFEST.MF,检查Require-Bundle中au.xxxxx.yyyy.sysenv的版本范围:
- 确保版本范围覆盖导出的
sysenv插件版本(比如导出版本是1.0.0,不要写[1.0.0,1.0.0)这种排他范围) - 避免不必要的版本限制,若无需严格版本,可简化为
au.xxxxx.yyyy.sysenv;bundle-version="1.0.0"或直接省略版本(不推荐,易引发版本冲突)
2. 确认产品配置的插件包含
打开产品定义文件(.product):
- 切换到
Plug-ins标签页,手动勾选au.xxxxx.yyyy.sysenv插件(不要依赖自动依赖解析,静态调用可能无法被自动识别) - 若使用Feature打包,检查对应的Feature是否包含
sysenv插件,且Feature被添加到产品配置中
3. 检查sysenv插件的导出配置
打开sysenv插件的MANIFEST.MF:
- 确认
Export-Package中存在au.xxxxx.yyyy.sysenv,且无x-internal或x-friends限制(若仅允许one插件访问,需明确添加x-friends:="au.xxxxx.yyyy.one") - 检查
Bundle-ClassPath配置,默认值为.,若有自定义路径,需确保包含Environment类所在的编译输出目录
4. 清理缓存后重新构建
- 关闭Eclipse,删除工作区下的
.metadata/.plugins/org.eclipse.pde.core目录(清除PDE的构建缓存) - 重启Eclipse,执行
Project > Clean...清理所有项目并重新编译 - 打开产品定义文件,点击
Validate按钮验证配置,再重新导出产品
5. 修正导出后的启动配置
打开导出产品目录下的configuration/config.ini:
- 检查
osgi.bundles列表,确认au.xxxxx.yyyy.sysenv存在,且添加@start标记强制启动(比如au.xxxxx.yyyy.sysenv@start) - 确保
sysenv插件的条目在one插件之前,保证依赖加载顺序正确
6. 借助OSGi控制台诊断
修改产品启动脚本,添加-console参数,启动后在控制台执行以下命令:
ss:查看所有插件状态,确认sysenv插件处于ACTIVE状态bundle au.xxxxx.yyyy.one:查看one插件的依赖解析情况,确认sysenv已被正确依赖findclass au.xxxxx.yyyy.sysenv.Environment:查看该类的提供方,以及哪些插件能访问到它
内容的提问来源于stack exchange,提问作者Jonathan Masters
相关产品推荐
相关产品推荐

