【JAVA調錯】----JBoss釋出多個專案時丟擲webAppRootKey錯誤
錯誤由來
說一說事情的緣由,最近專案中加了日誌,在專案中加了spring監聽器:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/config/log4j.xml</param-value>
</context-param>
<!--啟動一個watchdog執行緒每1800秒掃描一下log4j配置檔案的變化 -->
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>1800000</param-value>
</context-param>
<!--spring log4j監聽器 -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class >
</listener>
log4jRefreshInterval
為重新整理間隔,單位毫秒
log4jConfigLocation
為log4j
配置檔案路徑,也可使用classpath:xxx
的形式
進行如上配置後,修改log4j.xml
後,在重新整理間隔時間後,配置的監聽器Log4jConfigListener
會重新載入log4j
相關配置。
然後再JBoss中啟動專案,如果說啟動單個專案的話,是沒有問題出現的,但是同時啟動兩個或者以上的時候,就報出如下的ERROR
:
20:54:07,883 ERROR [org.apache. catalina.core.ContainerBase.[jboss.web].[default-host].[/itoo-exam-scoreanalyze-web]] (ServerService Thread Pool -- 55) JBWEB000287: 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:\Program Files\jboss-eap-6.2-itoo4.0\standalone\deployments\itoo-exam-calculatescore-ear.ear\itoo-exam-calculatescore-web.war\] instead of [F:\Program Files\jboss-eap-6.2-itoo4.0\standalone\deployments\itoo-exam-scoreanalyze-ear.ear\itoo-exam-scoreanalyze-web.war\] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
at org.springframework.web.util.WebUtils.setWebAppRootSystemProperty(WebUtils.java:150) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
at org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:117) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
at org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:46) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3339) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
at org.apache.catalina.core.StandardContext.start(StandardContext.java:3777) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
at org.jboss.as.web.deployment.WebDeploymentService.doStart(WebDeploymentService.java:156) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
at org.jboss.as.web.deployment.WebDeploymentService.access$000(WebDeploymentService.java:60) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
at org.jboss.as.web.deployment.WebDeploymentService$1.run(WebDeploymentService.java:93) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_60]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_60]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_60]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_60]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_60]
at org.jboss.threads.JBossThread.run(JBossThread.java:122)
錯誤原因
在上面的異常中明顯的提示:
Web app root system property already set to different value: 'webapp.root' = [F:\Program Files\jboss-eap-6.2-itoo4.0\standalone\deployments\itoo-exam-calculatescore-ear.ear\itoo-exam-calculatescore-web.war\] instead of [F:\Program Files\jboss-eap-6.2-itoo4.0\standalone\deployments\itoo-exam-scoreanalyze-ear.ear\itoo-exam-scoreanalyze-web.war\] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
在網上查了查,發生的原因是:當兩個web專案在同一容器中定義了相同的webAppRootKey
或者都沒有定義!也就是說:key
為webapp.root
已經指向專案itoo-exam-calculatescore-web
,不能在指向itoo-exam-scoreanalyze-web
;Web應用伺服器JBoss/Tomcat
不會為其下不同的web應用使用獨立的系統引數;即就是說,應用伺服器JBoss/Tomcat
上所有的web應用共用一個系統引數物件(webAppRootKey
,預設值為“webapp.root”
)。執行多個web應用時,你就必須通過 webAppRootKey
上下文引數的不同為不同的web應用指定不同的屬性名,如此,才不會造成多個web應用指向同一個webAppRootKey
。
webAppRootKey
為web
工程的根目錄在系統環境變數中的key
錯誤解決方案
有兩種解決方案:
第一種
修改web.xml
文件,指定工程自己的webAppRootKey
<!-- 專案app1的web.xml配置 -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>app1.root</param-value> <!-- 更改"webapp.root"為自定義的任意字串 -->
</context-param>
------------------- 華麗的分割線 --------------------
<!-- 專案app2的web.xml配置 -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>app2.root</param-value> <!-- 更改"webapp.root"為自定義的任意字串 -->
</context-param>
第二種
修改web.xml文件
<context-param>
<param-name>log4jExposeWebAppRoot</param-name>
<param-value>false</param-value>
</context-param>
log4jExposeWebAppRoot
為是否設定環境變數,可選true/false
。
Web應用根系統屬性是否被暴露,使得可以獲得日誌檔案相對於web應用的根目錄路徑。預設值是”true”,可以設定為”false”來禁止暴露web應用的根系統屬性。