由于已经存在根应用程序上下文,无法初始化上下文,因此在 tomcat 中部署战争失败

Posted

技术标签:

【中文标题】由于已经存在根应用程序上下文,无法初始化上下文,因此在 tomcat 中部署战争失败【英文标题】:Deployment of war is failing in tomcat because of Cannot initialize context because there is already a root application context present 【发布时间】:2021-04-03 23:49:57 【问题描述】:

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

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 文件。

【问题讨论】:

【参考方案1】:

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

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

public class SessionConfigInitializer extends AbstractHttpSessionApplicationInitializer 

    public SessionConfigInitializer() 
        super(SessionConfig.class);
    

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

发布这个以防其他人陷入这种情况可能会帮助他们。

【讨论】:

【参考方案2】:

你必须看看你的tomcat安装在哪里,看看webapp文件夹,这个文件夹里有所有的web应用程序。 例如在我的情况下: C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.27\webapps

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

【讨论】:

我正在使用 ubuntu 服务器。我的 tomcat 在 /opt/tomcat 中。除了这个没有其他的tomcat。 所以,如果您使用 tomcat,请查看 tomcat 中的“webapp”文件夹。有应用程序在“webapp”文件夹中有多少个文件夹。 只有一个文件夹,这是我的应用程序以及战争文件 现在检查文件夹:'Apache Tomcat 8.0.27\conf\Catalina\localhost'。那里有xml吗? 不,没有xml文件。但在 conf 目录中有 web.xml

以上是关于由于已经存在根应用程序上下文,无法初始化上下文,因此在 tomcat 中部署战争失败的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Karaf 2.2.0 OSGi 容器中的根上下文运行 WAR

spring 集成测试无法加载上下文“另一个资源已经存在,名称为 dataSource”

以编程方式确定JBoss 5.1中的JNDI根上下文/ ear名称

Nexus 和 GraphQL:“上下文”类型的根输入路径不存在

添加另一个上下文根模拟 webseal - Websphere 8.5

Spring MVC 初始化源码—ContextLoaderListener监听器与根上下文容器的初始化