执行mvn install/package时Spotless插件报错,求助JDK相关解决方法
解决Spotless Maven插件与JDK模块兼容性问题
问题原因
你使用的com.diffplug.spotless:spotless-maven-plugin:2.4.2版本过于老旧,和JDK9及以上版本的模块系统不兼容。插件依赖的Google Java Format旧版本会尝试访问JDK内部的com.sun.tools.javac.util.Context类,但JDK9+的模块机制默认不对外暴露这类内部API,从而触发权限访问错误。
解决方案
方案一:升级Spotless插件版本(推荐)
直接将插件升级到适配JDK模块系统的新版本(至少3.x以上,建议用最新稳定版)。修改子项目或根项目的pom.xml中Spotless插件的配置:
<plugin> <groupId>com.diffplug.spotless</groupId> <artifactId>spotless-maven-plugin</artifactId> <!-- 替换为最新稳定版,例如2.37.0或更高 --> <version>2.37.0</version> <executions> <execution> <id>spotless-check</id> <goals> <goal>check</goal> </goals> </execution> </executions> <!-- 其余配置保持不变 --> </plugin>
升级后重新执行mvn package或mvn clean install即可,新版本已适配JDK模块系统,无需额外配置。
方案二:给Maven添加JDK模块参数(临时 workaround)
如果暂时无法升级插件,可以在执行Maven命令时添加JVM参数,允许JDK暴露内部类给Spotless:
mvn package --add-opens jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
若在IDEA中运行Maven任务,可按以下步骤配置:
- 打开Run/Debug Configurations
- 找到对应的Maven运行配置(如package)
- 在VM options中添加:
--add-opens jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED - 保存后重新运行任务
方案三:降级到JDK8(仅适合无JDK9+特性需求的场景)
如果项目不需要JDK9及以上版本的特性,可以切换项目JDK版本到JDK8(JDK8无模块系统,不会触发该权限问题):
- 打开IDEA的File → Project Structure,将Project SDK切换为JDK8
- 修改
pom.xml中的maven-compiler-plugin配置,指定编译版本为1.8:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
总结
优先选择方案一,升级插件版本是最彻底的解决方式,能避免后续出现同类兼容性问题;方案二仅作为临时应急手段;方案三只适合确实不需要JDK9+特性的项目。
内容的提问来源于stack exchange,提问作者XinyuYao
相关产品推荐
相关产品推荐

