天天看點

部署兩個項目時報 Web app root system property already set to different value:

原文部落格在:http://blog.csdn.net/downloadsunlight2009/article/details/7514634

最近在搭建項目環境的時候出現了下面的錯誤

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. oldValue + ” - Choose unique webAppRootKey values in your web.xml files!” );
  8. }
  9. String root = servletContext.getRealPath(“/” );
  10. if (root == null ) {
  11. throw new IllegalStateException (“Cannot set web app root system property when WAR file is not
  12. expanded”);
  13. }
  14. System .setProperty(key, root);
  15. servletContext.log(“Set web app root system property: ” + key + ” = ” + root);
  16. }

從代碼看出,該方法其實就是把該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項目,要配置不同的,不能重複

如果配置了

log4j.appender.file.File=${web.sample.root}/WEB-INF/logs/sample.log

log4j會自己自動建立logs目錄, 不需要手工顯式建立空的logs目錄

解決方案:

在啟動出現錯誤的工程web.xml增加如下語句便可

webAppRootKey

app.root