Java访问Google Sheet时遇JsonReader类未找到错误求助
解决方案
1. 核心原因
编译通过但运行时丢类,是因为项目启用了Java模块化(JPMS),但存在两个关键问题:
- Gson 2.7是2016年的老版本,没有模块化支持(缺少
module-info.java),无法被JPMS识别; - 主模块的
module-info.java中没有显式声明依赖Gson模块,导致运行时类加载器无法找到对应类。
2. 具体修复步骤
(1)升级Gson到模块化兼容版本
将build.gradle中的Gson依赖替换为最新稳定版(如2.10.1),新版本自带模块化支持:
implementation (group: 'com.google.code.gson', name: 'gson', version: '2.10.1')
(2)修改module-info.java添加依赖声明
在主模块com.egensolve.edt.edt的模块声明文件中,加入对Gson的依赖声明:
module com.egensolve.edt.edt { requires javafx.controls; requires javafx.fxml; requires com.google.gson; // 新增这一行 requires com.google.api.client; requires com.google.api.services.sheets; requires com.google.oauth.client.jetty; exports com.egensolve.edt.edt; // 根据自身代码调整导出包 }
(3)验证jlink打包配置
因为使用了jlink插件,升级后的Gson是模块化依赖,配合上面的requires声明,jlink会自动将Gson模块包含到打包镜像中,无需额外配置。
(4)IDE运行配置检查
如果直接在IDE中运行,确保运行配置的**模块路径(Module Path)**包含Gson依赖,而非仅放在类路径(Class Path)中。
3. 补充说明
编译期没问题是因为Gradle的implementation依赖会把Gson加入编译类路径,但JPMS运行时要求显式声明模块依赖,否则类加载器无法从模块路径中加载Gson类,最终触发NoClassDefFoundError。
内容的提问来源于stack exchange,提问作者EgenSolve
相关产品推荐
相关产品推荐

