Java 21项目中jjwt-api自动模块编译找不到问题排查
问题原因
这是Gradle处理模块化依赖的逻辑差异导致的:
- 你的
ModuleFinder代码直接指定jar路径,Java会按规则将其推断为自动模块jjwt.api;IntelliJ的提示混淆了依赖坐标名(jjwt-api)和实际自动模块名(jjwt.api),但它确实能识别到模块存在。 - 但Gradle默认会把既无
module-info.java也无Automatic-Module-Name的依赖放到类路径,而非模块路径。javac在编译模块化项目时只会扫描模块路径找模块,因此找不到jjwt.api而报错。
解决方案
有两种靠谱的解决办法:
方法1:让Gradle把依赖放到模块路径
在build.gradle.kts里添加配置,强制Gradle将所有可推断为模块的依赖(包括自动模块)加入模块路径:
java { modularity.inferModulePath.set(true) } dependencies { implementation("io.jsonwebtoken:jjwt-api:0.12.5") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.5") runtimeOnly("io.jsonwebtoken:jjwt-gson:0.12.5") }
开启inferModulePath后,Gradle会自动处理自动模块,javac就能找到jjwt.api了。
方法2:兼容类路径依赖(放弃模块化约束)
如果不需要严格遵循模块化规则,可以修改module-info.java:
- 要么直接删掉
requires jjwt.api;语句,让代码从类路径加载jjwt的类; - 要么用
requires static jjwt.api;,仅在编译时检查模块存在,运行时从类路径加载。
这种方式简单但会丢失模块化的强封装特性,适合临时兼容场景。
额外检查
先跑你的ModuleFinder代码,确认输出的模块名确实是module jjwt.api,确保module-info.java里的requires语句和实际模块名完全一致,避免拼写错误。
内容的提问来源于stack exchange,提问作者xtay2
相关产品推荐
相关产品推荐

