war 的部署在 tomcat 中失败,因为无法初始化上下文,因为已经存在根应用程序上下文

Deployment of war is failing in tomcat because of Cannot initialize context because there is already a root application context present

几天以来我一直在努力解决这个问题。而且我真的不明白这个错误是从哪里来的。我已经在 SO 上关注了一些关于此的话题,this and

26-Dec-2020 12:48:18.633 SEVERE [main] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
        java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml!
                at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:263)
                at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
                at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4714)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5177)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
                at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
                at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:706)
                at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978)
                at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1848)
                at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
                at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)

我已经编写了一组 API,我正在尝试将其部署到 tomcat 服务器上。在部署期间,我的应用程序正在启动,但由于已经存在其他一些上下文而被中止。

为什么我的应用程序没有启动成功?我的 webapps 文件夹中只有一个 war 文件,我已删除其余文件。

我也不明白它在说哪个 web.xml 文件。

您必须查看安装 tomcat 的位置并查看 webapp 文件夹,此文件夹中有所有 Web 应用程序。 例如在我的例子中: C:\Program Files\Apache软件Foundation\ApacheTomcat8.0.27\webapps

或查看 C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.27\conf\Catalina\localhost 如果 tomcat 服务器文件夹之外存在任何其他 Web 应用程序。

终于找到罪魁祸首了。我不知道为什么我觉得 spring session 文档需要大量工作。我可能是错的。

无论如何,我正在使用扩展 AbstractHttpSessionApplicationInitializer 的初始化程序,如文档中所述。

public class SessionConfigInitializer extends AbstractHttpSessionApplicationInitializer {

    public SessionConfigInitializer() {
        super(SessionConfig.class);
    }
}

当我查看 AbstractHttpSessionApplicationInitializer 时,它在启动时正在执行此操作 servletContext.addListener(new ContextLoaderListener(rootAppContext));

发布这个以防其他人遇到这种情况可能会对他们有所帮助。