gpt4 book ai didi

java - "Cannot initialize context because there is already a root app..."当 Spring Vaadin 代码更改后发生 Jetty 自动重启时?

转载 作者:行者123 更新时间:2023-12-02 04:55:59 25 4
gpt4 key购买 nike

当我使用 Jetty 运行带有 Vaadin 的 Spring 应用程序时,我遇到了以下问题:

我对 Jetty 进行了配置,它会扫描项目工作目录,如果它看到代码中所做的更改,它会自动重新启动服务器(就像 Tomcat 一样)。

我注意到,即使我对代码进行了很小的更改,然后 Jetty 会自动重新启动,也会引发以下异常:

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!

我知道当有多个 ContextLoaderListener 时会抛出此异常因为两个 ContextLoaderListener 都尝试加载相同的根 ApplicationContext (因此导致异常),也如此处所述:

Why this Spring application with java-based configuration don't work properly

重点是我没有注册另一个 ContextLoaderListener (或者至少,我这么认为,因为我不能确定,因为我通过 Vaadin Spring 插件 -> https://vaadin.com/directory#addon/vaadin-spring 作为 Maven 将 Spring 与 Vaadin 一起使用依赖性,并且该插件尚未正式稳定)。

我确信的一件事是,我的代码中唯一的监听器如下:

package com.app.config;

import javax.servlet.annotation.WebListener;

import org.springframework.web.context.ContextLoaderListener;

@WebListener
public class AppContextLoaderListener extends ContextLoaderListener {
}

所以我想“也许插件有问题?”。但后来我尝试使用 Tomcat 而不是 Jetty 重现该问题(启动 Tomcat,使用 Run on Server 在 Tomcat 上运行应用程序,修改一些任意代码,等待 Tomcat 自动重新发布更改),但 Tomcat 永远不会抛出异常。/p>

所以这可能与 Jetty 有关?有人也经历过类似的事情吗?

问题出在哪里?

这是applicationContext.xml我使用的文件(为了完整性我发布它):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

<bean class="com.app.config.AppConfig" />
<context:component-scan base-package="com.app" />
</beans>

编辑:这是异常的完整堆栈跟踪:

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:277)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:764)
at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:406)
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:756)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:242)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1221)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:699)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:454)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at runjettyrun.scanner.RJRFileChangeListener.filesChanged(RJRFileChangeListener.java:155)
at org.eclipse.jetty.util.Scanner.reportBulkChanges(Scanner.java:680)
at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:546)
at org.eclipse.jetty.util.Scanner.scan(Scanner.java:398)
at org.eclipse.jetty.util.Scanner$1.run(Scanner.java:348)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)

最佳答案

您正在使用 run-jetty-run,它不会像您期望的那样重新加载/重新启动。

注意:run-jetty-run 不是一个 jetty 工具或项目,它是一个第三方工具,与核心 jetty 没有共同的提交者。

无论是使用jetty-distribution、jetty-maven-plugin还是jetty-runner,你都会有更好的运气,主要是因为上下文重新加载是通过DeploymentManager正确完成的(而run-jetty-run则没有)不要使用)。

关于java - "Cannot initialize context because there is already a root app..."当 Spring Vaadin 代码更改后发生 Jetty 自动重启时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28773444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com