No Spring WebApplicationInitializer types detected on classpath

情况:

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);
        }
    }
}

 

posted @ 2019-03-11 11:43  江湖小小白  阅读(2942)  评论(2编辑  收藏  举报