Liubsyy / HotSecondsIDEA

HotSeconds是一款Java远程热部署的插件,可实现秒级一键化热更新。插件分为HotSecondsClient(IDEA热部署插件)和HotSecondsServer(服务端javaagent热更新插件),可以热更新java和常用配置文件,也支持常用框架(Spring,MyBatis)的热更新,相对传统部署可节省大量时间提高开发效率。
GNU General Public License v2.0
376 stars 49 forks source link

java.lang.IllegalStateException: Unable to redefine classes #31

Closed majiatao closed 1 year ago

majiatao commented 1 year ago

springboot以jar包的形式启动,目前远程热部署一部分会生效,也有的会遇见下面这种问题,请指导一下原因是什么? HOTSECONDS: 18:29:26.630 ERROR err java.lang.IllegalStateException: Unable to redefine classes at org.hotswap.agent.config.PluginManager.hotswap(PluginManager.java:296) at com.liubs.hotdeployseconds.server.HotDeployServiceImpl.hotswapClass(HotDeployServiceImpl.java:88) at com.liubs.hotdeployseconds.server.HotDeployServiceImpl.loadNewClass(HotDeployServiceImpl.java:183) at com.liubs.hotdeployseconds.server.HotDeployServiceImpl.loadNewClassBatch(HotDeployServiceImpl.java:250) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357) at sun.rmi.transport.Transport$1.run(Transport.java:200) at sun.rmi.transport.Transport$1.run(Transport.java:197) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:196) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.UnsupportedOperationException: class redefinition failed: attempted to add a method at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method) at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:170) at org.hotswap.agent.config.PluginManager.hotswap(PluginManager.java:292) ... 20 more

Liubsyy commented 1 year ago

Java几?如果是Java8那就是XXaltjvm=dcevm 没加,或者没生效,Java8以上那就是没按文档装jdk

majiatao commented 1 year ago

java8 181版本 我刚测试貌似是因为存在 private static final Logger logger=LoggerFactory.getLogger(XxxController.class); 的问题,是存在static静态变量就不可以嘛?

Java几?

Liubsyy commented 1 year ago

不是,随意改代码都没问题的,包括增删字段方法类

majiatao commented 1 year ago

应该是生效的,因为java文件不存在静态变量的可以远程热部署成功的,存在静态变量的就不可以,

Java几?如果是Java8那就是XXaltjvm=dcevm 没加,或者没生效,Java8以上那就是没按文档装jdk

Liubsyy commented 1 year ago

跟静态变量也没关系的,增加静态变量只是触发类的静态初始化,不加则不触发

majiatao commented 1 year ago

Reference

那这个的原因还能是出现在哪里呢?

Liubsyy commented 1 year ago

就是没生效,ps -ef|grep java把jvm参数贴一下吧

majiatao commented 1 year ago

就是没生效,ps -ef|grep java把jvm参数贴一下吧

重新把server端放在运行目录下 就可以了,谢谢大佬