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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM