1. 程式人生 > >【JAVA調錯】----JBoss釋出多個專案時丟擲webAppRootKey錯誤

【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 為重新整理間隔,單位毫秒

log4jConfigLocationlog4j配置檔案路徑,也可使用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或者都沒有定義!也就是說:keywebapp.root已經指向專案itoo-exam-calculatescore-web,不能在指向itoo-exam-scoreanalyze-web;Web應用伺服器JBoss/Tomcat不會為其下不同的web應用使用獨立的系統引數;即就是說,應用伺服器JBoss/Tomcat上所有的web應用共用一個系統引數物件(webAppRootKey,預設值為“webapp.root”)。執行多個web應用時,你就必須通過 webAppRootKey 上下文引數的不同為不同的web應用指定不同的屬性名,如此,才不會造成多個web應用指向同一個webAppRootKey

webAppRootKeyweb工程的根目錄在系統環境變數中的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應用的根系統屬性。