Nacos 2.x.x版本不适用JDK17的处理方式

由于nacos使用了反射,但是高版本 JDK(Java9+)引入了Java 模块化机制(JPMS),做了严格的反射权限控制,而 Nacos 2.x.x 底层依赖的 Tomcat、SpringBoot 组件还沿用了 JDK8 的反射写法,在高版本 JDK 中会触发权限拦截,直接导致启动失败。

报错信息:Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field static final boolean java.io.FileSystem.useCanonCaches accessible: module java.base does not "opens java.io" to unnamed module @2f7a2457

解决方案包括:

方案一:降级 JDK 版本到 JDK8

最简单粗暴,但是如果已经使用了更高版本JDK切换比较麻烦则不推荐。

方案二:改用Nacos 3.X.X版本

Nacos 3.x.x 需要64 bit JDK 17+,新版本跟老版本有些区别,如果仅用于学习可以使用,生产上需要另外考虑适配性。

方案三:不改 JDK 版本,修改启动脚本添加兼容参数

以Nacos 2.5.2 的windows启动cmd文件为例,添加使用反射访问JDK的模块的权限的参数,效果如下:

在set NACOS_OPTS 前面,添加如下参数

bash 复制代码
rem ========== Java 17+ module opens for Tomcat 9.0.83+ ===============
set "JAVA_OPT=%JAVA_OPT% --add-opens java.base/java.io=ALL-UNNAMED"
set "JAVA_OPT=%JAVA_OPT% --add-opens java.base/java.lang=ALL-UNNAMED"
set "JAVA_OPT=%JAVA_OPT% --add-opens java.base/java.util=ALL-UNNAMED"
set "JAVA_OPT=%JAVA_OPT% --add-opens java.base/sun.nio.ch=ALL-UNNAMED"
rem ====================================================================

在最后的启动命令里,添加上刚刚添加的参数,在"%JAVA%"后面添加%JAVA_OPT%,不用添加双引号 。

bash 复制代码
set COMMAND="%JAVA%" %JAVA_OPT% %NACOS_JVM_OPTS% %NACOS_OPTS% %NACOS_CONFIG_OPTS% %NACOS_LOG4J_OPTS% nacos.nacos %*

保存后正常启动即可。其他版本的启动文件可能略有区别,视情况修改。

前面加的--add-opens 是JVM 核心参数,作用是「开放模块权限 」,允许指定模块的指定包,对「未命名模块」开放反射访问权限(包括私有字段 / 私有方法)

ALL-UNNAMED :代表「所有未命名模块」,Nacos、Tomcat、SpringBoot 这些应用程序,在 JDK 模块化体系中都属于「未命名模块」,写死这个值即可。

相关推荐
码农小卡拉1 天前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮1 天前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu1 天前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
跳动的梦想家h1 天前
环境配置 + AI 提效双管齐下
java·vue.js·spring
坚持就完事了1 天前
Java中的集合
java·开发语言
wjhx1 天前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
一个有梦有戏的人1 天前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
YCY^v^1 天前
JeecgBoot 项目运行指南
java·学习
人间打气筒(Ada)1 天前
jenkins基于Pipeline发布项目
java·pipeline·jenkins·流水线·ci·cd·cicd
爬山算法1 天前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate