春天的WebApproot
Posted
技术标签:
【中文标题】春天的WebApproot【英文标题】:WebApproot in Spring 【发布时间】:2011-06-28 05:32:08 【问题描述】:我收到此错误消息
[ 严重:向 org.springframework.web.util.Log4jConfigListener 类的侦听器实例发送上下文初始化事件的异常 java.lang.IllegalStateException:Web 应用程序根系统属性已设置为不同的值:'webapp.root' = [C:\Users\jaanlai\Documents\NetBeansProjects\absSovellus\build\web] 而不是 [C:\Users\Administrator \Documents\NetBeansProjects\keycard2\build\web] - 为 web.xml 文件中的“webAppRootKey”上下文参数选择唯一值!
这很奇怪,因为我的文件中没有定义任何 webAppRootKey。这是什么?
【问题讨论】:
解决方案见drglennn.blogspot.com/2008/08/…和forum.springsource.org/archive/index.php/t-32873.html 【参考方案1】:webAppRootKey
是 Spring 在几个地方使用的上下文参数。在这种情况下,Log4jWebConfigurer
正在使用它。它将 webapp 根公开为可在 log4j 配置文件中使用的系统属性,如下所示:
log4j.appender.testfile.File=$webapp.root/WEB-INF/testlog.log
如果您出于某种原因想要相对于您的 webapp 根目录定位您的日志,您可以使用它。
您遇到的问题是某些容器(尤其是 Tomcat)不维护每个 webapp 的系统属性映射。当您没有指定webAppRootKey
时,Spring 将其默认为webapp.root
。由于您在同一个容器中运行两个应用程序,因此您尝试启动的第二个应用程序会看到 webAppRootKey
已设置(通过默认值),并引发错误。否则,webAppRootKey
的设置将不正确,您最终可能会在另一个 Web 应用中看到来自一个 Web 应用的日志。
您可以使用web.xml
中的上下文参数指定不同的webAppRootKey
,如下所示:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>webapp.root.one</param-value>
</context-param>
和
log4j.appender.testfile.File=$webapp.root.one/WEB-INF/testlog.log
在你的 log4j 中。这应该可以解决冲突。
【讨论】:
请注意,我们在使用 Websphere v8 时遇到了同样的问题,您的解决方案解决了这个问题。 (不想让别人认为问题只出在Tomcat上) 我在 JBoss 上也遇到过这个问题,你的解决方案对我有用。 @MichaelLucas Websphere v8 上的问题是否影响日志记录以外的任何内容? @indybee ...不,我不这么认为。那是很久以前的事了,很难记住,但我认为它只影响了 log4j。【参考方案2】:<context-param>
<param-name>log4jExposeWebAppRoot</param-name>
<param-value>false</param-value>
</context-param>
...
这解决了我的问题。归功于:- http://forum.springsource.org/archive/index.php/t-32873.html
【讨论】:
很好,我打算在 maven 中定义一个属性,然后过滤 web.xml。但是它在我使用 mongrel eclipse 插件通过我的 webapps 启动 tomcat 的开发中不起作用。 谢谢,它也帮助了我! 63 v 52 v 18 v alsoRans,q of 38,截至 20191114。【参考方案3】:您的应用服务器中似乎有多个默认 Log4jConfigListener
配置的 webapp。
Log4jConfigurationListener
的默认行为是将 webapp root 公开为名为 webapp.root
的系统属性,以便您在指定日志文件位置时使用它。但是,如果同名的系统属性已经存在,则会抛出异常。
您可以使用名为<context-param>
的名为webAppRootKey
的系统属性配置每个应用程序的名称,或者通过将Log4jConfigListener
的<init-param>
的名为log4jExposeWebAppRoot
的false
设置为禁用系统属性的公开。
另请参阅:
Log4jWebConfigurer
【讨论】:
这会阻止应用程序运行,给出 404 - 请求的源不可用吗? @michaeljackson4ever:我猜没有。毕竟,您始终可以通过删除Log4jConfigListener
来检查它。
我遇到了应用程序无法运行的问题。设置根密钥没有帮助。【参考方案4】:
以防万一其他人在没有解决问题的情况下完成了上述操作:
我们的 webapp 正确设置了 webAppRootKey,但我仍然遇到上述异常。重新启动 Glassfish 并重新部署相同的 war-file 工作,去看看。
【讨论】:
【参考方案5】:如果您使用logback
而不是log4j
并得到相同的错误,这解决了它:
<context-param>
<param-name>logbackExposeWebAppRoot</param-name>
<param-value>false</param-value>
</context-param>
【讨论】:
以上是关于春天的WebApproot的主要内容,如果未能解决你的问题,请参考以下文章