I am leveraging Spring Buildpack support for native image in one of my projects. There is nothing fancy configured, only Jetty is being used as servlet container. The native image being built cannot be started due to the following exception:
o.s.boot.SpringApplication : Application run failed
org.springframework.context.ApplicationContextException: Unable to start web server
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:165) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:618) ~[secret.package.diagrameditor.Application:6.1.5]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:149) ~[na:na]
at secret.package.diagrameditor.Application.main(Application.java:16) ~[secret.package.diagrameditor.Application:na]
at java.base@21.0.2/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH) ~[na:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jettyServletWebServerFactory': java.lang.NoSuchMethodException: org.eclipse.jetty.ee10.webapp.ClassMatcher$ByPackageOrName.<init>()
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607) ~[secret.package.diagrameditor.Application:6.1.5]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[secret.package.diagrameditor.Application:6.1.5]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[secret.package.diagrameditor.Application:6.1.5]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[secret.package.diagrameditor.Application:6.1.5]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[secret.package.diagrameditor.Application:6.1.5]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[secret.package.diagrameditor.Application:6.1.5]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getWebServerFactory(ServletWebServerApplicationContext.java:223) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:186) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162) ~[secret.package.diagrameditor.Application:3.2.4]
... 8 common frames omitted
Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: org.eclipse.jetty.ee10.webapp.ClassMatcher$ByPackageOrName.<init>()
at org.eclipse.jetty.util.IncludeExcludeSet.<init>(IncludeExcludeSet.java:106) ~[secret.package.diagrameditor.Application:12.0.7]
at org.eclipse.jetty.ee10.webapp.ClassMatcher.<init>(ClassMatcher.java:500) ~[na:na]
at org.eclipse.jetty.ee10.webapp.ClassMatcher.<init>(ClassMatcher.java:506) ~[na:na]
at org.eclipse.jetty.ee10.webapp.ClassMatcher.<init>(ClassMatcher.java:511) ~[na:na]
at org.eclipse.jetty.ee10.webapp.AbstractConfiguration$Builder.<init>(AbstractConfiguration.java:35) ~[na:na]
at org.springframework.boot.autoconfigure.websocket.servlet.JettyWebSocketServletWebServerCustomizer.customize(JettyWebSocketServletWebServerCustomizer.java:44) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.autoconfigure.websocket.servlet.JettyWebSocketServletWebServerCustomizer.customize(JettyWebSocketServletWebServerCustomizer.java:39) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.lambda$postProcessBeforeInitialization$0(WebServerFactoryCustomizerBeanPostProcessor.java:72) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.util.LambdaSafe$Callbacks.lambda$invoke$0(LambdaSafe.java:287) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.util.LambdaSafe$LambdaSafeCallback.invoke(LambdaSafe.java:159) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.util.LambdaSafe$Callbacks.lambda$invoke$1(LambdaSafe.java:286) ~[secret.package.diagrameditor.Application:3.2.4]
at java.base@21.0.2/java.util.ArrayList.forEach(ArrayList.java:1596) ~[secret.package.diagrameditor.Application:na]
at java.base@21.0.2/java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1116) ~[secret.package.diagrameditor.Application:na]
at org.springframework.boot.util.LambdaSafe$Callbacks.invoke(LambdaSafe.java:286) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.postProcessBeforeInitialization(WebServerFactoryCustomizerBeanPostProcessor.java:72) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.postProcessBeforeInitialization(WebServerFactoryCustomizerBeanPostProcessor.java:58) ~[secret.package.diagrameditor.Application:3.2.4]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:422) ~[secret.package.diagrameditor.Application:6.1.5]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778) ~[secret.package.diagrameditor.Application:6.1.5]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[secret.package.diagrameditor.Application:6.1.5]
... 16 common frames omitted
Caused by: java.lang.NoSuchMethodException: org.eclipse.jetty.ee10.webapp.ClassMatcher$ByPackageOrName.<init>()
at java.base@21.0.2/java.lang.Class.checkMethod(DynamicHub.java:1075) ~[secret.package.diagrameditor.Application:na]
at java.base@21.0.2/java.lang.Class.getConstructor0(DynamicHub.java:1238) ~[secret.package.diagrameditor.Application:na]
at java.base@21.0.2/java.lang.Class.getDeclaredConstructor(DynamicHub.java:2930) ~[secret.package.diagrameditor.Application:na]
at org.eclipse.jetty.util.IncludeExcludeSet.<init>(IncludeExcludeSet.java:79) ~[secret.package.diagrameditor.Application:12.0.7]
... 34 common frames omitted
I attached a small demo project created by Spring Initializr: demo.zip
If you run ./gradlew bootBuildImage and then try to start the created native image with docker run ... it will fail.
Expected behaviour would be that the image just works for Jetty also.
Comment From: wilkinsona
This isn't specific to buildpacks as the same failure occurs when running gradle nativeRun. It can be fixed by using a more recent version of the Native Build Tools plugin:
id 'org.graalvm.buildtools.native' version '0.10.1'
The app then starts successfully:
> Task :nativeRun
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.4)
2024-04-09T17:33:51.214+01:00 INFO 11222 --- [demo] [ main] com.example.demo.DemoApplication : Starting AOT-processed DemoApplication using Java 21 with PID 11222 (/Users/awilkinson/Downloads/demo-2/build/native/nativeCompile/demo started by awilkinson in /Users/awilkinson/Downloads/demo-2)
2024-04-09T17:33:51.214+01:00 INFO 11222 --- [demo] [ main] com.example.demo.DemoApplication : No active profile set, falling back to 1 default profile: "default"
2024-04-09T17:33:51.241+01:00 INFO 11222 --- [demo] [ main] o.s.b.w.e.j.JettyServletWebServerFactory : Server initialized with port: 8080
2024-04-09T17:33:51.241+01:00 INFO 11222 --- [demo] [ main] org.eclipse.jetty.server.Server : jetty-12.0.7; built: 2024-02-29T21:19:41.771Z; git: c89aca8fd34083befd79f328a3b8b6ffff04347e; jvm 21+37-LTS
2024-04-09T17:33:51.243+01:00 INFO 11222 --- [demo] [ main] o.e.j.s.h.ContextHandler.application : Initializing Spring embedded WebApplicationContext
2024-04-09T17:33:51.243+01:00 INFO 11222 --- [demo] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 28 ms
2024-04-09T17:33:51.261+01:00 INFO 11222 --- [demo] [ main] o.e.j.session.DefaultSessionIdManager : Session workerName=node0
2024-04-09T17:33:51.261+01:00 INFO 11222 --- [demo] [ main] o.e.jetty.server.handler.ContextHandler : Started osbwej.JettyEmbeddedWebAppContext@2fbda98f{application,/,b=file:/private/var/folders/2w/mhq2nt4d0xx2w6w4c36n468h0000gn/T/jetty-docbase.8080.3441324763782722407/,a=AVAILABLE,h=oeje10s.SessionHandler@14f3d91c{STARTED}}
2024-04-09T17:33:51.262+01:00 INFO 11222 --- [demo] [ main] o.e.j.e.servlet.ServletContextHandler : Started osbwej.JettyEmbeddedWebAppContext@2fbda98f{application,/,b=file:/private/var/folders/2w/mhq2nt4d0xx2w6w4c36n468h0000gn/T/jetty-docbase.8080.3441324763782722407/,a=AVAILABLE,h=oeje10s.SessionHandler@14f3d91c{STARTED}}
2024-04-09T17:33:51.262+01:00 INFO 11222 --- [demo] [ main] org.eclipse.jetty.server.Server : Started oejs.Server@487cf5c3{STARTING}[12.0.7,sto=0] @92ms
2024-04-09T17:33:51.279+01:00 INFO 11222 --- [demo] [ main] o.e.j.s.h.ContextHandler.application : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-04-09T17:33:51.279+01:00 INFO 11222 --- [demo] [ main] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2024-04-09T17:33:51.279+01:00 INFO 11222 --- [demo] [ main] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms
2024-04-09T17:33:51.280+01:00 INFO 11222 --- [demo] [ main] o.e.jetty.server.AbstractConnector : Started ServerConnector@26709c3b{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2024-04-09T17:33:51.280+01:00 INFO 11222 --- [demo] [ main] o.s.b.web.embedded.jetty.JettyWebServer : Jetty started on port 8080 (http/1.1) with context path '/'
2024-04-09T17:33:51.280+01:00 INFO 11222 --- [demo] [ main] com.example.demo.DemoApplication : Started DemoApplication in 0.081 seconds (process running for 0.11)