“无法初始化上下文,因为已经存在根应用程序......”当代码Spring Vaadin发生更改后发生Jetty自动重启?

时间:2015-02-27 20:10:18

标签: java spring jetty vaadin

当我使用Jetty运行它时,我在使用Vaadin的Spring应用程序中遇到以下问题:

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

我注意到,如果我对代码进行了一些小改动,然后Jetty会自动重启,则抛出以下异常:

  

java.lang.IllegalStateException:无法初始化上下文,因为已存在根应用程序上下文 - 检查web.xml中是否有多个ContextLoader *定义!

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

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

关键是我没有注册另一个ContextLoaderListener(或者至少,我认为是这样,因为我不能确定因为我通过Vaadin Spring插件与Vaadin一起使用Spring - > {{3作为Maven依赖,并且插件还没有正式的STABLE)。

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

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永远不会抛出异常

那么它可能与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)

1 个答案:

答案 0 :(得分:2)

你正在使用run-jetty-run,它没有像你期望的那样重新加载/重启。

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

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