春天的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 的系统属性,以便您在指定日志文件位置时使用它。但是,如果同名的系统属性已经存在,则会抛出异常。

您可以使用名为&lt;context-param&gt; 的名为webAppRootKey 的系统属性配置每个应用程序的名称,或者通过将Log4jConfigListener&lt;init-param&gt; 的名为log4jExposeWebAppRootfalse 设置为禁用系统属性的公开。

另请参阅:

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的主要内容,如果未能解决你的问题,请参考以下文章

spring的发音春天该怎么发音

快到春天,我的遐想

春天云流'bindingService'错误

春天的特点和意义?

10 2022春天过去了

家门口每年春天都有这种白色很大只的鸟 也不知道叫啥?