Tomcat 部署多个项目时webAppRootKey冲突

xiaoxiao2021-03-01  19

Tomcat 部署多个项目时webAppRootKey冲突

部署新的web项目,tomcat起不来,发现罪魁祸首是web.xml 里面的webAppRootKey导致的。 之前没接触过这个,引发深思。 分析原因:多个项目要对webAppRootKey进行配置,主要是让log能将日志写到对应项目根目录下

先看下错误日志

Web app root system property already set to different value: 'webapp.root' = [/home/user/tomcat/webapps/project1/] instead of [/home/user/tomcat/webapps/project2/] - Choose unique values for the 'webAppRootKey' context-param in your web. xml files!

意思是“webapp.root”这个key已经指向了项目1,不可以再指向项目2。

原理分析

SpringMVC容器启动时,WebAppRootListener会将该webapp的项目路径设置到系统全局变量中,以便在可以使用系统全局变量的地方获取到webapp的项目路径,默认该变量名为webapp.root,比如在log4j配置文件中使用${webapp.root} 。 我们可以在web.xml中对该变量名进行自定义(任意名称)。 而且在Tomcat中,因为其不会为每个webapp隔离系统全局变量,我们必须在不同webapp中设置不同的变量名,否则就会出现上面的错误。

因为我们有两个项目都使用了如下相同的配置,导致“webapp.root ”命名冲突。

在项目的web.xml中有一段声明

<!-- 应用1 --> <context-param> <param-name>webAppRootKey</param-name> <param-value>webapp.root</param-value> </context-param>

在log4j.properties对声明的全局变量有使用

### Output to the log file ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = ${springmvc.root}/WEB-INF/logs/log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = debug log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

解决方案

分别将每个项目设置不同的名称,问题即可解决。

转载请注明原文地址: https://www.6miu.com/read-3350325.html

最新回复(0)