情况:
1.使用 Tomcat 8 Maven 插件
2.使用 ServletContainerInitializer 模式配置 Spring
配置好后发现只会加载 spring-web 配置的 WebApplicationInitializer 的子类,自己配置的 WebApplicationInitializer 子类不会加载,传入的 WebApplicationInitializer 类型只有spring 自己的
查询无结果,最后换回 Tomcat 7 Maven 插件,问题解决
Tomcat 8 Maven
<pluginRepositories> <pluginRepository> <id>alfresco-public</id> <url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url> </pluginRepository> </pluginRepositories> <packaging>war</packaging> <build> <plugins> <!-- 指定jdk --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <encoding>UTF-8</encoding> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat8-maven-plugin</artifactId> <version>3.0-r1756463</version> <configuration> <port>80</port> <path>/ssm</path> <server>tomcat8</server> <charset>UTF-8</charset> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin> </plugins> </build>
Tomcat 7 Maven
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!--<ignorePackaging>true</ignorePackaging>--> <port>80</port> <path>/ssm</path> <server>tomcat7</server> <charset>UTF-8</charset> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin>
尝试自己配置 ServletContainerInitializer,不使用 Spring 配置的 ,发现 Tomcat 8 Maven 也可以正常执行
附上 org.springframework.web.SpringServletContainerInitializer 源码,可以看到 WebApplicationInitializer 类型的集合为空
@HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInitializer implements ServletContainerInitializer { @Override public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException { List<WebApplicationInitializer> initializers = new LinkedList<>(); if (webAppInitializerClasses != null) { for (Class<?> waiClass : webAppInitializerClasses) { if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) && WebApplicationInitializer.class.isAssignableFrom(waiClass)) { try { initializers.add((WebApplicationInitializer) ReflectionUtils.accessibleConstructor(waiClass).newInstance()); } catch (Throwable ex) { throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex); } } } } if (initializers.isEmpty()) { servletContext.log("No Spring WebApplicationInitializer types detected on classpath"); return; } servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath"); AnnotationAwareOrderComparator.sort(initializers); for (WebApplicationInitializer initializer : initializers) { initializer.onStartup(servletContext); } } }