alibaba / nacos

an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.
https://nacos.io
Apache License 2.0
30.01k stars 12.8k forks source link

Nacos 2.4.1 在 JDK 8 中运行正常,在 JDK 17/22 运行异常 #12498

Closed xuxiaowei-com-cn closed 2 weeks ago

xuxiaowei-com-cn commented 4 weeks ago
  1. JDK: dragonwell-17.0.3.0.3+7-GA、graalvm-community-openjdk-22.0.2+9.1
  2. Nacos: 2.4.1
  3. 解决方法:增加参数 --add-opens java.base/java.lang=ALL-UNNAMED
  4. 异常日志
java.lang.reflect.InaccessibleObjectException: Unable to make field private byte java.lang.StackTraceElement.format accessible: module java.base does not "opens java.lang" to unnamed module @36f6e879
        at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:388)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:364)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:312)
        at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:183)
        at java.base/java.lang.reflect.Field.setAccessible(Field.java:177)
        at com.caucho.hessian.io.JavaDeserializer.getFieldMap(JavaDeserializer.java:363)
        at com.caucho.hessian.io.JavaDeserializer.<init>(JavaDeserializer.java:72)
        at com.caucho.hessian.io.StackTraceElementDeserializer.<init>(StackTraceElementDeserializer.java:60)
        at com.caucho.hessian.io.ContextSerializerFactory.<clinit>(ContextSerializerFactory.java:481)
        at com.caucho.hessian.io.SerializerFactory.<init>(SerializerFactory.java:143)
        at com.caucho.hessian.io.SerializerFactory.<init>(SerializerFactory.java:137)
        at com.alibaba.nacos.consistency.serialize.NacosHessianSerializerFactory.<init>(NacosHessianSerializerFactory.java:59)
        at com.alibaba.nacos.consistency.serialize.HessianSerializer.<init>(HessianSerializer.java:41)
        at com.alibaba.nacos.consistency.SerializeFactory.<clinit>(SerializeFactory.java:39)
        at com.alibaba.nacos.core.distributed.raft.JRaftProtocol.<init>(JRaftProtocol.java:100)
        at com.alibaba.nacos.core.distributed.ConsistencyConfiguration.lambda$strongAgreementProtocol$0(ConsistencyConfiguration.java:40)
        at com.alibaba.nacos.core.distributed.ConsistencyConfiguration.getProtocol(ConsistencyConfiguration.java:53)
        at com.alibaba.nacos.core.distributed.ConsistencyConfiguration.strongAgreementProtocol(ConsistencyConfiguration.java:40)
        at com.alibaba.nacos.core.distributed.ConsistencyConfiguration$$EnhancerBySpringCGLIB$$81ac405d.CGLIB$strongAgreementProtocol$0(<generated>)
        at com.alibaba.nacos.core.distributed.ConsistencyConfiguration$$EnhancerBySpringCGLIB$$81ac405d$$FastClassBySpringCGLIB$$f4840480.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
        at com.alibaba.nacos.core.distributed.ConsistencyConfiguration$$EnhancerBySpringCGLIB$$81ac405d.strongAgreementProtocol(<generated>)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:641)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:626)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:234)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1284)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1245)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:494)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:349)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1189)
        at com.alibaba.nacos.sys.utils.ApplicationUtils.getBeanIfExist(ApplicationUtils.java:155)
        at com.alibaba.nacos.core.distributed.ProtocolManager.initCPProtocol(ProtocolManager.java:124)
        at com.alibaba.nacos.core.distributed.ProtocolManager.getCpProtocol(ProtocolManager.java:85)
        at com.alibaba.nacos.naming.cluster.ServerStatusManager.hasLeader(ServerStatusManager.java:70)
        at com.alibaba.nacos.naming.cluster.ServerStatusManager.refreshServerStatus(ServerStatusManager.java:62)
        at com.alibaba.nacos.naming.cluster.ServerStatusManager.access$000(ServerStatusManager.java:37)
        at com.alibaba.nacos.naming.cluster.ServerStatusManager$ServerStatusUpdater.run(ServerStatusManager.java:92)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
        at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358)
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1570)
shalk commented 4 weeks ago

I do not think server is support JDK17/22

lpy0759 commented 4 weeks ago

这个参数应该JVM参数设置,一般不是用在jar包执行时可以加上?我是通过sh startup.sh运行的,请问如何加上述参数 @xuxiaowei-com-cn

xuxiaowei-com-cn commented 4 weeks ago

@lpy0759 chrome_uGo7e9HSyy

Renzhz commented 3 weeks ago
# start
echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &

JAVA_OPEN_OPTION="--add-opens java.base/java.lang=ALL-UNNAMED" # 手动添加

if [[ "$JAVA_OPT_EXT_FIX" == "" ]]; then
  nohup "$JAVA" ${JAVA_OPEN_OPTION} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
else
  nohup "$JAVA" ${JAVA_OPEN_OPTION} "$JAVA_OPT_EXT_FIX" ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 & 
fi
KomachiSion commented 3 weeks ago

看起来是hessain序列化的时候,随着jdk的升级,部分反射操作可能不兼容了, 如果能通过一些jvm参数支持是最好的, 否则只能升级hassain的版本了。

KomachiSion commented 3 weeks ago

https://github.com/alibaba/nacos/pull/12449

可能和这个pr有关, 之前有社区同学说sofa的hessain和caucho的hessain冲突,所以PR移除了对caucho 的 hessain的,转向统一使用sofa的hessain

sofa的hessain的概率是封装了一些caucho的hessain之后的打包,可能基础版本的caucho的hessain和之前使用的hessain版本不一致, 然后对jdk17+的支持有问题。

看下能否推动sofa-jraft解决这个问题, 如果不行的话, 下个版本回滚https://github.com/alibaba/nacos/pull/12449 改动。

break1145 commented 3 weeks ago

加上--add-opens java.base/java.lang=ALL-UNNAMED还是相同报错,只能换2.4.0解决了

yanhaoqiang commented 3 weeks ago

Environment

  1. jdk17

Solution

add this method into "startup.sh", will start successfully without error log

try_to_add_vm_open_module()
{
    if [ "$JAVA_MAJOR_VERSION" -gt "11" ] ; then
      echo $JAVA_MAJOR_VERSION
      JAVA_OPT="${JAVA_OPT} --add-opens java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED"
    fi
}

try_to_add_vm_open_module

tips

  1. the param 'JAVA_MAJOR_VERSION' had initialized in "startup.sh", and above method should be added behind this.
wz826 commented 2 weeks ago
# start
echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &

JAVA_OPEN_OPTION="--add-opens java.base/java.lang=ALL-UNNAMED" # 手动添加

if [[ "$JAVA_OPT_EXT_FIX" == "" ]]; then
  nohup "$JAVA" ${JAVA_OPEN_OPTION} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
else
  nohup "$JAVA" ${JAVA_OPEN_OPTION} "$JAVA_OPT_EXT_FIX" ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 & 
fi

和hessian关系不大,主要是因为nacos配置为JDK1.8,而JDK17+开始使用按模块引入包语法,不兼容之前的语法,不过一定要运行的话可以加入以下命令: 文件:nacos/bin/startup.sh JAVA_OPT="${JAVA_OPT} --add-opens java.base/java.lang=ALL-UNNAMED "

KomachiSion commented 2 weeks ago

Closed by https://github.com/alibaba/nacos/pull/12565