Reputation: 1843
I've got a web app I recently upgraded from springboot to springboot 2. When I deploy it to Tomcat 8 it seems to start but doesn't start fully.
In localhost.2019-09-04.log (Tomcat) I have the following error:
2 Spring WebApplicationInitializers detected on classpath
I've tried various things from this post:
2 Spring WebApplicationInitializers detected on classpath
but has no luck. How can I find out which package another WebApplicationInitializers might be in?
Upvotes: 3
Views: 7030
Reputation: 21
I had this problem and after doing a new basic spring boot with the bare minimum I still had this problem. The last thing left was to check the innocent application.properties and found with trial and error that there was an invalid property. Once this line was removed, everything worked.
This was the property:
logging.level.org.apache.catalina=DEBUG
Upvotes: 0
Reputation: 90427
That log is output from SpringServletContainerInitializer
which is Servlet 3.0 ServletContainerInitializer
that handles WebApplicationInitializer
.
So the most simple way to find out what are these WebApplicationInitializer
is to create our own ServletContainerInitializer
that also handle WebApplicationInitializer
and print their information to console.
@HandlesTypes(WebApplicationInitializer.class)
public class FooServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
for (Class<?> clazz : c) {
System.out.println(clazz);
System.out.println(clazz.getResource('/' + clazz.getName().replace('.', '/') + ".class"));
System.out.println("----------------");
}
}
}
I am referring to this for how to print the JAR file path of a class.
To register it , create a file META-INF/services/javax.servlet.ServletContainerInitializer
. Inside this file , include the fully qualified class name of our ServletContainerInitializer
:
org.foo.bar.FooServletContainerInitializer
Then it should execute during Tomcat starts.
Upvotes: 3