jdk17环境,redisson-spring-boot-starter启动报错

时间:2024-10-13 08:00:59

报错信息:2024-01-29 10:33:18.864 [basic-meet,,] [main] ERROR .redis. - redissionClient init error
2024-01-29 10:33:18.868 [basic-meet,,] [main] ERROR - Unable to make field private final byte[] accessible: module does not "opens " to unnamed module @202b0582
: Unable to make field private final byte[] accessible: module does not "opens " to unnamed module @202b0582

原因:

在JDK 9及以后的版本中,Java引入了模块化系统,其中一些内部API,如value字段,现在变得不可直接访问。这是为了增强Java平台的安全性和稳定性。

当你尝试使用反射来访问这些字段时,就会遇到你所描述的错误。错误信息表明,你正在尝试访问的字段()在模块中,而该模块并未对一个名为“unnamed module”的模块开放。redisson的FSTClazzInfo 类

protected  createFieldInfo(Field field) {
    FieldKey key = null;
    if ( != null) {
        key = new FieldKey((), ());
         res = ()(key);
        if (res != null) {
            ();
            return res;
        }
    }

    (true);
    Predict predict =  ? null : (Predict)();
     result = new (predict != null ? () : null, field, );
    if ( != null && key != null) {
        (key, result);
    }

    ();
    return result;
} 设置反射私有自动访问权限(true),jdk17 会调用checkCanSetAccessible抛出异常。

解决方案:

  1. 升级redisson包

    <dependency>
        <groupId></groupId>
        <artifactId>redisson-spring-boot-starter</artifactId>
        <version>3.23.1</version>
    </dependency> ,3.23.1使用Kryo5Codec通过ClassLoader在通过流获取。测试启动成功
  2. 使用 --add-opens JVM参数:如果你确实需要使用反射来访问这些字段,你可以在启动JVM时使用--add-opens参数来打开特定的模块。java --add-opens /=ALL-UNNAMED -jar your_application.jar。不建议,这种解决方案可能存在潜在的安全风险,因为它打开了一个本来是受保护的模块,允许其他模块进行未经授权的访问。因此,建议在必要时使用此选项,同时确保您的应用程序没有潜在的漏洞和安全问题。。