web.xml中webAppRootKey
------------------------------------------------------------------------------------------------
1、 web.xml配置
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>webapp.root</param-value>
</context-param>
"webapp.root"這個字串可以隨便寫任何字串。如果不配置預設值是"webapp.root"。
可以用System.getProperty("webapp.root")來動態獲專案的執行路徑。
一般返回結果例如:/usr/local/tomcat6/webapps/專案名
2、解決以下報錯
部署在同一容器中的Web專案,要配置不同的<param-value>,不能重複,否則報類似下面的錯誤:
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.
3、載入方式
Spring通過org.springframework.web.util.WebAppRootListener 這個監聽器來執行時的專案路徑。
但是如果在web.xml中已經配置了 org.springframework.web.util.Log4jConfigListener這個監聽器,
則不需要配置WebAppRootListener了。因為Log4jConfigListener已經包含了WebAppRootListener的功能
一般配置型別下面的例子:
Xml程式碼 收藏程式碼
<!-- 載入Log4J 配置檔案 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>WEB-INF/conf/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>3000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
4、在執行時動態的找出專案的路徑
在log4j.properties配置檔案,就可以按下面的方式使用${webapp.root}:
log4j.appender.file.File=${webapp.root}/WEB-INF/logs/sample.log
就可以在執行時動態的找出專案的路徑
啟動Tomcat是報錯:
Web app root system property already set to different value: 'webapp.root' = [E:\AIT\poscoGroup\web\] instead of [E:\AIT\TOMCAT-6.0\webapps\posco\] - Choose unique values for the 'webAppRootKey'
解決方案:
以下是轉帖:
由於懶惰想copy一份工程來做測試用因此當AVerPortal 和AverPortalTest 都在tomcat的編譯專案的時候會出現錯誤
2010-5-14 9:45:40 org.apache.catalina.core.StandardContext listenerStart
嚴重: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener
java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [F:/JDKandTOMCAT/TOMCAT/Tomcat 6.0/webapps/AVerPortal/] instead of [F:/JDKandTOMCAT/TOMCAT/Tomcat 6.0/webapps/AVerPortalTest/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
原因是當在web.xml中沒指定
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>AVerPortalTest</param-value>
</context-param>
的時候按照預設的
做法1
在tomcatserver啟動專案目錄刪除AVerPortal 和AverPortalTest 其中一個
做法2
在web.XML中新增webAppRootKey指定好
近日,因為懶惰,直接從原有專案切出一個分塊成了一個專案,然後同時釋出啟動,出現以下異常
Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener
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!
at org.springframework.web.util.WebUtils.setWebAppRootSystemProperty(WebUtils.java:99)
at org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:116)
at org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:51)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3773)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4270)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:866)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:850)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:638)
at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:320)
at org.apache.catalina.core.StandardHost.install(StandardHost.java:875)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:657)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:476)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1008)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:394)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:166)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1134)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:832)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1126)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:521)
at org.apache.catalina.core.StandardService.start(StandardService.java:519)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:2345)
at org.apache.catalina.startup.Catalina.start(Catalina.java:594)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:297)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:398)
看看異常,還是挺簡單的,應該是兩個專案的設定重複了,導致出錯,但我發現web.xml裡並沒有配置webAppRootKey項,然後查閱網上資料,參考
,原來是因為如果沒有web.xm 內沒有設定webAppRootKey項,是為預設設定
public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException {
String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);
String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY);
String oldValue = System .getProperty(key);
if (oldValue != null ) {
throw new IllegalStateException ("WARNING: Web app root system property already set: " + key + " = " +
oldValue + " - Choose unique webAppRootKey values in your web.xml files!" );
}
String root = servletContext.getRealPath("/" );
if (root == null ) {
throw new IllegalStateException ("Cannot set web app root system property when WAR file is not
expanded");
}
System .setProperty(key, root);
servletContext.log("Set web app root system property: " + key + " = " + root);
}
從程式碼看出,該方法其實就是把該web application的根目錄的絕對檔案路徑作為屬性儲存在 System的屬性列表中。該屬性的名字,由web.xml檔案中的名為"webAppRootKey"的引數值指出。如果不在web.xml中定義 webAppRootKey引數,那麼屬性名就是預設的"webapp.root".在我們的petclinic專案中已經定義了 webAppRootKey引數,其值為"petclinic.root",因此,屬性的名字就是"petclinic.root".
最後將webAppRootKey項配置好,錯誤解決。