@WebListener doesn't work out of the box in a native image.

See this smoke test: https://github.com/spring-projects/spring-aot-smoke-tests/tree/main/boot/servlet-component-scan

It uses @ServletComponentScan together with @WebServlet, @WebFilter and @WebListener. While the servlet and the filter work, the @WebListener doesn't.

The exception which pops up:

java.lang.ClassNotFoundException: com.example.servlet.componentscan.TestListener
    at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.loadClass(TomcatEmbeddedWebappClassLoader.java:72) ~[na:na]
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1245) ~[servlet-component-scan:10.1.12]
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:491) ~[na:na]
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:473) ~[na:na]
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:143) ~[na:na]
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4385) ~[servlet-component-scan:10.1.12]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4896) ~[servlet-component-scan:10.1.12]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[servlet-component-scan:10.1.12]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328) ~[na:na]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318) ~[na:na]
    at java.base@17.0.7/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[servlet-component-scan:na]
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[na:na]
    at java.base@17.0.7/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[servlet-component-scan:na]
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) ~[servlet-component-scan:10.1.12]
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:846) ~[na:na]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[servlet-component-scan:10.1.12]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328) ~[na:na]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318) ~[na:na]
    at java.base@17.0.7/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[servlet-component-scan:na]
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[na:na]
    at java.base@17.0.7/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[servlet-component-scan:na]
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) ~[servlet-component-scan:10.1.12]
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:241) ~[na:na]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[servlet-component-scan:10.1.12]
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428) ~[na:na]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[servlet-component-scan:10.1.12]
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:918) ~[na:na]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[servlet-component-scan:10.1.12]
    at org.apache.catalina.startup.Tomcat.start(Tomcat.java:485) ~[servlet-component-scan:10.1.12]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:489) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:211) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:602) ~[servlet-component-scan:6.0.11]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[servlet-component-scan:3.1.3-SNAPSHOT]
    at com.example.servlet.componentscan.ServletComponentScanApplication.main(ServletComponentScanApplication.java:10) ~[servlet-component-scan:na]

It looks like the class isn't registered for reflection. I got it to pass by implementing a RuntimeHintsRegistrar which registers the class with invoke public ctor flags.

Comment From: mhalbritter

Duplicate of https://github.com/spring-projects/spring-boot/issues/36008.

Hint to myself: first search issue tracker, then create issue.