From 807d6764afc692308179f27c93b09ceab085d841 Mon Sep 17 00:00:00 2001
From: Andreas Svanberg <andreass@dsv.su.se>
Date: Thu, 16 May 2024 23:43:21 +0200
Subject: [PATCH] Faster startup time by avoiding class-path scanning

Disables Spring's built-in ServletContainerInitializer which uses WebApplicationInitializer SPI that is discovered via slow class-path scanning. Now directly, and only, call the SpringBootServletInitializer via our own ServletContainerInitializer instead.

Be mindful if, in the future, we rely on other WebApplicationInitializers that will now not be run.
---
 war/src/main/java/se/su/dsv/scipro/war/Main.java       | 10 +++++++++-
 .../jakarta.servlet.ServletContainerInitializer        |  1 +
 war/src/main/webapp/WEB-INF/web.xml                    |  5 ++---
 3 files changed, 12 insertions(+), 4 deletions(-)
 create mode 100644 war/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer

diff --git a/war/src/main/java/se/su/dsv/scipro/war/Main.java b/war/src/main/java/se/su/dsv/scipro/war/Main.java
index 71a5c80da3..3f629e21ab 100644
--- a/war/src/main/java/se/su/dsv/scipro/war/Main.java
+++ b/war/src/main/java/se/su/dsv/scipro/war/Main.java
@@ -2,6 +2,9 @@ package se.su.dsv.scipro.war;
 
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.EntityManagerFactory;
+import jakarta.servlet.ServletContainerInitializer;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.protocol.http.WicketFilter;
 import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
@@ -35,7 +38,12 @@ import java.util.Set;
 @SpringBootApplication
 @EntityScan("se.su.dsv.scipro")
 @Import({CoreConfig.class, ApiConfig.class})
-public class Main extends SpringBootServletInitializer {
+public class Main extends SpringBootServletInitializer implements ServletContainerInitializer {
+    @Override
+    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
+        onStartup(ctx);
+    }
+
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
         return builder.sources(Main.class);
diff --git a/war/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer b/war/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer
new file mode 100644
index 0000000000..ad4ffa3bbd
--- /dev/null
+++ b/war/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer
@@ -0,0 +1 @@
+se.su.dsv.scipro.war.Main
diff --git a/war/src/main/webapp/WEB-INF/web.xml b/war/src/main/webapp/WEB-INF/web.xml
index d78229ac6f..b346f3b49c 100755
--- a/war/src/main/webapp/WEB-INF/web.xml
+++ b/war/src/main/webapp/WEB-INF/web.xml
@@ -5,9 +5,8 @@
 
     <display-name>SciPro</display-name>
 
-    <listener>
-        <listener-class>org.springframework.web.SpringServletContainerInitializer</listener-class>
-    </listener>
+    <!-- disables Spring's built in ServletContainerInitializer which causes a slow class path scanning -->
+    <absolute-ordering/>
 
     <session-config>
         <session-timeout>480</session-timeout>