Hi all,
my Spring Boot 3 project runs fine if I use Java 17, but after AoT-compilation with GraalVM, I get the following error:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.0.1)
2023-01-03T21:02:55.998Z INFO 1 --- [ main] c.a.c.CustomerServiceApplication : Starting AOT-processed CustomerServiceApplication using Java 17.0.5 with PID 1 (/CustomerService started by root in /)
2023-01-03T21:02:55.998Z INFO 1 --- [ main] c.a.c.CustomerServiceApplication : The following 1 profile is active: "prod"
2023-01-03T21:02:56.021Z INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-01-03T21:02:56.022Z INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-01-03T21:02:56.022Z INFO 1 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.4]
2023-01-03T21:02:56.027Z INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-01-03T21:02:56.027Z INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 28 ms
2023-01-03T21:02:56.049Z WARN 1 --- [ main] i.m.c.i.binder.jvm.JvmGcMetrics : GC notifications will not be available because MemoryPoolMXBeans are not provided by the JVM
2023-01-03T21:02:56.052Z INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-01-03T21:02:56.130Z INFO 1 --- [ main] c.a.c.CustomerServiceApplication : Started CustomerServiceApplication in 0.142 seconds (process running for 0.146)
2023-01-03T21:02:56.132Z ERROR 1 --- [ main] o.s.boot.SpringApplication : Application run failed
java.lang.IllegalArgumentException: javax.management.NotCompliantMBeanException: com.sun.management.ThreadMXBean: Method java.lang.management.ThreadMXBean.getThreadInfo has parameter or return type that cannot be translated into an open type
at java.management@17.0.5/javax.management.StandardMBean.<init>(StandardMBean.java:271) ~[CustomerService:na]
at org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk.management.ManagementSupport.addMXBean(ManagementSupport.java:301) ~[na:na]
at org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk.management.ManagementSupport.getPlatformMBeanServer(ManagementSupport.java:285) ~[na:na]
at java.management@17.0.5/java.lang.management.ManagementFactory.getPlatformMBeanServer(ManagementFactory.java:45) ~[CustomerService:na]
at io.micrometer.core.instrument.binder.tomcat.TomcatMetrics.getMBeanServer(TomcatMetrics.java:98) ~[na:na]
at io.micrometer.core.instrument.binder.tomcat.TomcatMetrics.<init>(TomcatMetrics.java:72) ~[na:na]
at org.springframework.boot.actuate.metrics.web.tomcat.TomcatMetricsBinder.onApplicationEvent(TomcatMetricsBinder.java:63) ~[CustomerService:3.0.1]
at org.springframework.boot.actuate.metrics.web.tomcat.TomcatMetricsBinder.onApplicationEvent(TomcatMetricsBinder.java:42) ~[CustomerService:3.0.1]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[na:na]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[na:na]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:413) ~[CustomerService:6.0.3]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:370) ~[CustomerService:6.0.3]
at org.springframework.boot.context.event.EventPublishingRunListener.started(EventPublishingRunListener.java:103) ~[CustomerService:3.0.1]
at org.springframework.boot.SpringApplicationRunListeners.lambda$started$5(SpringApplicationRunListeners.java:76) ~[na:na]
at java.base@17.0.5/java.lang.Iterable.forEach(Iterable.java:75) ~[CustomerService:na]
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118) ~[na:na]
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112) ~[na:na]
at org.springframework.boot.SpringApplicationRunListeners.started(SpringApplicationRunListeners.java:76) ~[na:na]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) ~[CustomerService:3.0.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) ~[CustomerService:3.0.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) ~[CustomerService:3.0.1]
at com.amazon.customerService.CustomerServiceApplication.main(CustomerServiceApplication.java:45) ~[CustomerService:na]
Caused by: javax.management.NotCompliantMBeanException: com.sun.management.ThreadMXBean: Method java.lang.management.ThreadMXBean.getThreadInfo has parameter or return type that cannot be translated into an open type
at java.management@17.0.5/com.sun.jmx.mbeanserver.Introspector.throwException(Introspector.java:468) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.MBeanAnalyzer.<init>(MBeanAnalyzer.java:120) ~[CustomerService:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.MBeanAnalyzer.analyzer(MBeanAnalyzer.java:102) ~[CustomerService:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.MXBeanIntrospector.getAnalyzer(MXBeanIntrospector.java:74) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.MBeanIntrospector.getPerInterface(MBeanIntrospector.java:192) ~[CustomerService:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.MBeanSupport.<init>(MBeanSupport.java:138) ~[CustomerService:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.MXBeanSupport.<init>(MXBeanSupport.java:66) ~[na:na]
at java.management@17.0.5/javax.management.StandardMBean.construct(StandardMBean.java:175) ~[CustomerService:na]
at java.management@17.0.5/javax.management.StandardMBean.<init>(StandardMBean.java:269) ~[CustomerService:na]
... 22 common frames omitted
Caused by: java.lang.IllegalArgumentException: Method java.lang.management.ThreadMXBean.getThreadInfo has parameter or return type that cannot be translated into an open type
at java.management@17.0.5/com.sun.jmx.mbeanserver.ConvertingMethod.from(ConvertingMethod.java:46) ~[CustomerService:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.MXBeanIntrospector.mFrom(MXBeanIntrospector.java:84) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.MXBeanIntrospector.mFrom(MXBeanIntrospector.java:54) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.MBeanAnalyzer.initMaps(MBeanAnalyzer.java:137) ~[CustomerService:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.MBeanAnalyzer.<init>(MBeanAnalyzer.java:118) ~[CustomerService:na]
... 29 common frames omitted
Caused by: javax.management.openmbean.OpenDataException: Cannot convert type: java.lang.management.ThreadInfo[]
at java.management@17.0.5/com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.openDataException(DefaultMXBeanMappingFactory.java:1539) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.mappingForType(DefaultMXBeanMappingFactory.java:261) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.ConvertingMethod.<init>(ConvertingMethod.java:212) ~[CustomerService:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.ConvertingMethod.from(ConvertingMethod.java:41) ~[CustomerService:na]
... 33 common frames omitted
Caused by: javax.management.openmbean.OpenDataException: Cannot convert type: java.lang.management.ThreadInfo
at java.management@17.0.5/com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.openDataException(DefaultMXBeanMappingFactory.java:1539) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.mappingForType(DefaultMXBeanMappingFactory.java:261) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.makeArrayOrCollectionMapping(DefaultMXBeanMappingFactory.java:319) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.makeMapping(DefaultMXBeanMappingFactory.java:289) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.mappingForType(DefaultMXBeanMappingFactory.java:259) ~[na:na]
... 35 common frames omitted
Caused by: javax.management.openmbean.OpenDataException: Can't map java.lang.management.ThreadInfo to an open data type
at java.management@17.0.5/com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.makeCompositeMapping(DefaultMXBeanMappingFactory.java:462) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.makeMapping(DefaultMXBeanMappingFactory.java:294) ~[na:na]
at java.management@17.0.5/com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory.mappingForType(DefaultMXBeanMappingFactory.java:259) ~[na:na]
... 38 common frames omitted
Comment From: wilkinsona
This looks to be very similar to https://github.com/spring-projects/spring-boot/issues/33210 and I suspect that it has a similar cause. Specifically, I suspect that either your app or the reachability metadata for one of its dependencies has MBean-related entries that it should not have. If you can provide a minimal sample that reproduces the problem, we can help to pinpoint its cause.
Comment From: smoell
Hi, thank you for the quick reply, the project can be found here:
https://github.com/smoell/spring-graalvm-issue
How to reproduce:
$ git clone https://github.com/smoell/spring-graalvm-issue.git
$ cd spring-graalvm-issue/spring-native/CustomerService
$ docker build -t spring/customer -f Dockerfile .
$ docker run spring/customer
Comment From: wilkinsona
Thanks for the sample.
The problem's caused by your dependency on Undertow. Its reachability metadata contains MBean-related entries that are harmful.
Your application isn't actually using Undertow anyway as it still has Tomcat on the classpath and it is preferred. This means that, until the reachability metadata is fixed, you can avoid the problem by removing the dependency on spring-boot-starter-undertow.
Comment From: smoell
Thank you, will try!
Comment From: smoell
That solved the issue, thank you!
Comment From: wilkinsona
Great. Thanks for letting us know. https://github.com/oracle/graalvm-reachability-metadata/pull/161 will hopefully fix the problem with Undertow.
Comment From: rishiraj88
Thanks.