Tomcat 部署多个项目时webAppRootKey冲突

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中有一段声明


<context-param>
    <param-name>webAppRootKeyparam-name>
    <param-value>webapp.rootparam-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

解决方案

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

你可能感兴趣的:(成长历程)