java.lang.IllegalStateException: Web app root system property already set to different value
最近在搭建項目環境的時候出現了下面的錯誤
java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [D:/tomcat-5.0.19/webapps/tzbms/] instead of [D:/tomcat-5.0.19/webapps/its/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
?
后來查了資料才知道
webAppRootKey是在java web項目的web.xml配置文件中表示項目的唯一標示,在Eclipse調試Web項目時,項目的路徑是一個臨時路徑,不在真正的路徑下,可以通過log4j日志的方式打印出屬性值,來看看臨時項目路徑在哪里,可以用System.getProperty("web.sample.root");如果web.xm 內沒有設置webAppRootKey項,是為默認設置,那么webAppRootKey就是缺省的"webapp.root"。
下面是相關源碼
1.???? ·??public??static??void??setWebAppRootSystemProperty(ServletContext?servletContext)?throws??IllegalStateException??{
2.???? ????????String??param?=?servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);
3.???? ????????String??key?=?(param?!=?null????param?:?DEFAULT_WEB_APP_ROOT_KEY);
4.???? ????????String??oldValue?=?System?.getProperty(key);
5.???? ????????if??(oldValue?!=?null?)?{
6.???? ????????????throw??new??IllegalStateException?("WARNING:?Web?app?root?system?property?already?set:?"??+?key?+?"?=?"??+
7.???? ????????????????????????????????????????????????????????????????
8.???? ?
9.???? ????????????oldValue?+?"?-?Choose?unique?webAppRootKey?values?in?your?web.xml?files!"?);
10.?? ????????}
11.?? ????????String??root?=?servletContext.getRealPath("/"?);
12.?? ????????if??(root?==?null?)?{
13.?? ????????????throw??new??IllegalStateException?("Cannot?set?web?app?root?system?property?when?WAR?file?is?not?
14.?? ?
15.?? expanded");
16.?? ????????}
17.?? ????????System?.setProperty(key,?root);
18.?? ????????servletContext.log("Set?web?app?root?system?property:?"??+?key?+?"?=?"??+?root);
19.?? ????}
20.?? ?
21.???
從代碼看出,該方法其實就是把該web?application的根目錄的絕對文件路徑作為屬性保存在 System的屬性列表中。該屬性的名字,由web.xml文件中的名為"webAppRootKey"的參數值指出。如果不在web.xml中定義 webAppRootKey參數,那么屬性名就是缺省的"webapp.root".
?
但最好設置,以免項目之間的名稱沖突。
?
?
Spring通過 org.springframework.web.util.WebAppRootListener 這個監聽器來壓入項目路徑。但是如果在web.xml中已經配置了 org.springframework.web.util.Log4jConfigListener
這個監聽器,則不需要配置WebAppRootListener了。因為Log4jConfigListener已經包含了WebAppRootListener的功能
部署在同一容器中的Web項目,要配置不同的<param-value>,不能重復
如果配置了
log4j.appender.file.File=${web.sample.root}/WEB-INF/logs/sample.log??
log4j會自己自動建立logs目錄, 不需要手工顯式建立空的logs目錄
?
?
解決方案:
在啟動出現錯誤的工程web.xml增加如下語句便可
<context-param>
<param-name>webAppRootKey</param-name>
<param-value> app.root </param-value>
</context-param>