Java开发Telegram Bot遭遇ExceptionInInitializerError异常求助
问题分析与解决方案
这个异常的核心原因是Java 9及以上版本的模块系统,与你使用的旧版依赖库(尤其是Guice/CGLIB)不兼容。
从栈信息里的InaccessibleObjectException可以看到:Java模块系统默认禁止未命名模块(你的项目属于这个模块)访问java.base模块里的java.lang.ClassLoader.defineClass方法,而旧版本的Guice依赖的CGLIB库会尝试通过反射调用这个受保护的方法来生成动态代理,这就触发了访问限制。另外,这个问题和你配置的Telegram代理没有关系——代理问题只会导致网络连接类异常,不会抛出这类反射访问错误。
下面是几种可行的解决办法:
降级到Java 8运行项目
Java 8没有模块系统,不存在这种访问限制,是最直接的解决方式。在Eclipse里操作:- 右键项目 →
Properties→Java Build Path→Libraries,把JRE System Library换成Java 8版本。 - 打开
Run Configurations,找到你的主类运行配置,在JRE标签下选择Java 8作为运行环境。
- 右键项目 →
升级依赖库到兼容Java 9+的版本
检查你的项目依赖:- 如果你使用的是官方Telegram Bots库(
org.telegram:telegrambots),升级到最新稳定版(比如6.x及以上),新版本已经适配了Java 9+的模块规则。 - 如果你直接依赖Guice,确保版本在4.2.0及以上——这个版本开始修复了模块系统下的反射访问问题。
- 如果你使用的是官方Telegram Bots库(
添加JVM启动参数(临时 workaround)
如果暂时无法升级依赖或降级Java,可以通过JVM参数强制开放模块访问权限:
在Eclipse的Run Configurations里,找到你的运行配置,切换到Arguments标签,在VM arguments中添加:--add-opens java.base/java.lang=ALL-UNNAMED这个参数会允许未命名模块访问
java.base模块里的java.lang包,临时绕过这个限制,但不推荐长期使用,还是建议升级依赖或降级Java。
内容的提问来源于stack exchange,提问作者Harmonic
相关产品推荐
相关产品推荐

