1. 程式人生 > >Tomcat反覆載入Spring配置檔案

Tomcat反覆載入Spring配置檔案

Tomcat有時候會重複載入配置檔案,這是由於server.xml配置不當造成的。

現象:

quartz定時執行了兩遍(其它配置檔案其實也載入了兩遍)

server.xml配置:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context path="" docBase="frms4j" reloadable="true"/> 
</Host>

原理:

在Web環境裡,會使用ContextLoader構造ApplicationContext後,壓進ServletContext。

由ContextLoaderListener或ContextLoaderServlet,在Web應用啟動時完成。

出現上述問題的原因是tomcat載入玩appBase="webapps"之後又去載入docBase,因此造成載入兩次專案的問題。解決:當然解決辦法有很多,主要是在server.xml配置上做手腳:1、撤銷掉<Context>標籤,但是URL中需要加入專案web路徑
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
  </Host>
2、在Tomcat下新建newWebapps,然後修改server.xml  
<Host name="localhost" appBase="newWebapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context path="" docBase="../webapps/frms4j" reloadable="true"/> 
</Host>
優點:不影響Eclipse的整合部署注意:可能會引發問題,找不到manager和host-manager目錄,把這兩個目錄拷貝到新指向的目錄即可
3、新建目錄myapps平級於webapps,然後修改server.xml  
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context path="" docBase="../myapps/frms4j" reloadable="true"/> 
</Host>
4、在webapps目錄下新建目錄myapp,然後修改server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context path="" docBase="/myapp/frms4j" reloadable="true"/> 
</Host>

類似問題:http://grokbase.com/t/tomcat/users/02cy9aaq8n/application-context-loaded-twice

參考:http://www.myexception.cn/web/665108.html