Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
xuxiaowei-com-cn opened this issue Aug 16, 2024 · 10 comments
Closed

Comments

@xuxiaowei-com-cn
Copy link
Contributor

  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
Copy link
Contributor

shalk commented Aug 16, 2024

I do not think server is support JDK17/22

@lpy0759
Copy link

lpy0759 commented Aug 17, 2024

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

@xuxiaowei-com-cn
Copy link
Contributor Author

@lpy0759
chrome_uGo7e9HSyy

@Renzhz
Copy link

Renzhz commented Aug 17, 2024

# 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
Copy link
Collaborator

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

@KomachiSion
Copy link
Collaborator

KomachiSion commented Aug 19, 2024

#12449

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

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

看下能否推动sofa-jraft解决这个问题, 如果不行的话, 下个版本回滚#12449 改动。

@break1145
Copy link

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

@yanhaoqiang
Copy link

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
Copy link

wz826 commented Aug 24, 2024

# 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
Copy link
Collaborator

Closed by #12565

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants