Skip to content

CodeGenerationException thrown when using AnnotationMBeanExporter on JDK 17 #28138

@lizongbo

Description

@lizongbo

Versions

  • Spring Version 5.3.16
  • JDK Version : Eclipse Adoptium Temurin-17.0.2+

Overview

create some bean (com.alibaba.druid.filter.stat.StatFilter) with class extends javax.management.NotificationBroadcasterSupport.

AnnotationMBeanExporter Bean:

@Configuration public class TestJmxBean { private static final Logger LOG = LoggerFactory.getLogger(TestJmxBean.class); @Bean @Lazy(false) public AnnotationMBeanExporter annotationMBeanExporter() { LOG.info("TestJmxBean.annotationMBeanExporter|REPLACE_EXISTING"); AnnotationMBeanExporter exporter = new AnnotationMBeanExporter(); exporter.setRegistrationPolicy(RegistrationPolicy.REPLACE_EXISTING); return exporter; } }

the demo project in the attach file:
springquartzdemo.zip

Steps to Reproduce

  1. import the project to ide.
  2. run gradlew build
  3. use jdk 8 run the main class success.
  4. use jdk 17 run the main class fail
  5. see the stack trace。
  6. cause : the package name $javax.management is not equals to javax.management ?
D:\Java\ide\workspace\springquartzdemo>D:\Java\jdk-17.0.2+8\bin\java -verbose:gc --add-opens java.management/javax.management=ALL-UNNAMED -cp dist/conf;dist/lib/* -Dcom.sun.management.jmxremote.port=19881 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dfile.encoding=UTF-8 com.lizongbo.springdemo.SpringQuartzBugTest [0.025s][info][gc] Using G1 [0.870s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 23M->5M(128M) 7.105ms 2022-03-05 21:39:11,366 main INFO The lookups option will be ignored. Message Lookups are no longer supported. [1.398s][info][gc] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 29M->7M(128M) 6.926ms 2022-03-05 21:39:11.987 [main] INFO TestJmxBean.annotationMBeanExporter(TestJmxBean.java:17) - TestJmxBean.annotationMBeanExporter|REPLACE_EXISTING Exception in thread "main" org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [stat-filter] with key 'stat-filter'; nested exception is org.springframework.cglib.core.CodeGenerationException: java.lang.IllegalArgumentException-->$javax.management.NotificationBroadcasterSupport$$FastClassBySpringCGLIB$$824990df not in same package as lookup class at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:626) at org.springframework.jmx.export.MBeanExporter.lambda$registerBeans$2(MBeanExporter.java:552) at java.base/java.util.HashMap.forEach(HashMap.java:1421) at org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExporter.java:552) at org.springframework.jmx.export.MBeanExporter.afterSingletonsInstantiated(MBeanExporter.java:435) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:972) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at com.lizongbo.springdemo.SpringQuartzBugTest.main(SpringQuartzBugTest.java:18) Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.IllegalArgumentException-->$javax.management.NotificationBroadcasterSupport$$FastClassBySpringCGLIB$$824990df not in same package as lookup class at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:580) at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363) at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:110) at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:108) at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61) at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34) at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:134) at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319) at org.springframework.cglib.reflect.FastClass$Generator.create(FastClass.java:65) at org.springframework.cglib.proxy.MethodProxy.helper(MethodProxy.java:135) at org.springframework.cglib.proxy.MethodProxy.init(MethodProxy.java:76) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:216) at org.springframework.aop.framework.CglibAopProxy$DynamicUnadvisedInterceptor.intercept(CglibAopProxy.java:481) at com.lizongbo.springdemo.SqlChcekStatFilter$$EnhancerBySpringCGLIB$$f714b8d3.getNotificationInfo(<generated>) at java.management/com.sun.jmx.mbeanserver.MBeanIntrospector.findNotifications(MBeanIntrospector.java:447) at java.management/com.sun.jmx.mbeanserver.MBeanIntrospector.getMBeanInfo(MBeanIntrospector.java:393) at java.management/com.sun.jmx.mbeanserver.MBeanSupport.<init>(MBeanSupport.java:139) at java.management/com.sun.jmx.mbeanserver.StandardMBeanSupport.<init>(StandardMBeanSupport.java:60) at java.management/com.sun.jmx.mbeanserver.Introspector.makeDynamicMBean(Introspector.java:194) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:893) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:320) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:523) at org.springframework.jmx.support.MBeanRegistrationSupport.doRegister(MBeanRegistrationSupport.java:138) at org.springframework.jmx.export.MBeanExporter.registerLazyInit(MBeanExporter.java:715) at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:597) ... 8 more Caused by: java.lang.IllegalArgumentException: $javax.management.NotificationBroadcasterSupport$$FastClassBySpringCGLIB$$824990df not in same package as lookup class at java.base/java.lang.invoke.MethodHandleStatics.newIllegalArgumentException(MethodHandleStatics.java:167) at java.base/java.lang.invoke.MethodHandles$Lookup$ClassFile.newInstance(MethodHandles.java:2283) at java.base/java.lang.invoke.MethodHandles$Lookup.makeClassDefiner(MethodHandles.java:2318) at java.base/java.lang.invoke.MethodHandles$Lookup.defineClass(MethodHandles.java:1843) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:577) ... 34 more [1.809s][info][gc] GC(2) Pause Young (Concurrent Start) (Metadata GC Threshold) 32M->9M(128M) 5.691ms [1.811s][info][gc] GC(3) Concurrent Mark Cycle [1.821s][info][gc] GC(3) Pause Remark 10M->10M(40M) 2.380ms [1.823s][info][gc] GC(3) Pause Cleanup 10M->10M(40M) 0.067ms [1.826s][info][gc] GC(3) Concurrent Mark Cycle 15.156ms 

bug004

bug005

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)status: backportedAn issue that has been backported to maintenance branchesstatus: feedback-providedFeedback has been providedtype: bugA general bug

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions