RCP应用访问Java 1.8构建的API,Eclipse内正常外置构建后无输出
问题成因
- 核心冲突:你依赖的API是Java 1.8编译生成的,Class文件版本为52.0,而RCP应用指定的执行环境为JavaSE-1.7,1.7版本的JVM最高仅支持51.0版本的Class文件,加载API类时会直接抛出
UnsupportedClassVersionError。 - Eclipse启动正常的原因:Eclipse运行RCP应用时,默认使用的是环境中配置的高版本JRE(通常为1.8及以上),高版本JVM向下兼容,可同时加载1.7编译的RCP代码和1.8编译的API依赖,因此运行无问题。
- 打包后无输出无报错的原因:Maven构建RCP产品时会按照指定的JavaSE-1.7执行环境匹配JRE,启动exe时实际运行在1.7版本JVM下,加载API失败抛出异常,但RCP默认未开启控制台日志输出,或你的调用代码存在异常被吞的情况,因此没有任何信息展示。
解决方法
方案1:升级RCP执行环境至JavaSE-1.8(优先推荐,改动最小)
- 修改MyRCPApplication.product文件中的执行环境配置,将JavaSE-1.7替换为JavaSE-1.8
- 调整Maven编译配置,将pom.xml中的maven-compiler-plugin配置的source、target版本均改为1.8
- 打包时配置RCP产品内置1.8版本JRE,避免依赖系统环境的JRE版本,确保exe启动时使用兼容的JVM
方案2:保留JavaSE-1.7执行环境的适配方案
- 联系API提供方获取基于Java 1.7编译的API版本,或自行拿到API源码后用JDK 1.7重新编译
- 若无法获取源码,可使用retrolambda等字节码转译工具,将1.8编译的API Class文件转换为1.7兼容的版本,转译后需做充分功能测试,避免1.8独有特性(如Stream、接口默认方法等)转译后出现异常
通用排查优化建议
- 在product文件的启动参数中添加
-consoleLog,开启RCP控制台日志输出,所有运行时异常都会直接打印到控制台,方便后续问题定位 - 检查API调用逻辑的异常捕获代码,确保没有空的catch块吞掉异常,需在异常处理逻辑中添加
e.printStackTrace()或日志输出语句 - 校验Maven依赖配置,确认引入的API依赖已被正确标记为RCP插件的依赖项,打包时会被包含到最终产品中,避免依赖缺失
内容的提问来源于stack exchange,提问作者Prakash
相关产品推荐
相关产品推荐

