解決Struts2.5配合Tomcat8出現could't clear cache問題(解決)

struts2.5 和 Tomcat8的Bug

昨天用struts框架做一個小項目,Console莫名其妙報出一下錯誤

couldn't clear tomcat cache
java.lang.NoSuchFieldException: resourceEntries
  at java.lang.Class.getDeclaredField(Class.java:1953)
  at com.opensymphony.xwork2.util.LocalizedTextUtil.clearMap(LocalizedTextUtil.java:859)
  at com.opensymphony.xwork2.util.LocalizedTextUtil.clearTomcatCache(LocalizedTextUtil.java:842)
  at com.opensymphony.xwork2.util.LocalizedTextUtil.reloadBundles(LocalizedTextUtil.java:821)
  at com.opensymphony.xwork2.util.LocalizedTextUtil.reloadBundles(LocalizedTextUtil.java:797)
  at com.opensymphony.xwork2.util.LocalizedTextUtil.findDefaultText(LocalizedTextUtil.java:214)
  at com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage(LocalizedTextUtil.java:666)
  at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:542)
  at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:370)
  at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:208)
  at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:123)
  at com.opensymphony.xwork2.ActionSupport.getText(ActionSupport.java:103)

google發現已經有人把這個bug提交給了apache,issue地址,具體原因就是

Tomcat8 introduce super class WebappClassLoaderBase and moved field
“resourceEntries” to it, so
WebappClassLoader.class.getDeclaredField(“resourceEntries”) will throw
NoSuchFieldException.

Tomcat8的類加載器WebappClassLoaderBase移除resourceEntries屬性。

尋找解決方案

  1. 看來是源碼的問題,把容器換成tomcat7的確可以解決問題,可是身爲一個強迫症氾濫的碼農怎麼受得了呢。

  2. 於是Github上翻看源碼(fix地址),一個叫lukaszlenart的傢伙已經提交了修復bug的代碼。
    重新編譯struts
    編譯成功G:\struts-2.3.20\src\xwork-core裏會出現一個target文件夾,拷貝替換工程裏的xwork-core-2.3.20.jar,大工告成。

  3. 第三種方案: Log4j2: 配置不顯示Struts2這個 類的 Debug信息, 只顯示Warning以上級別的 :
    方法如下 :

 <!-- Tomcat 8 去掉一個屬性,導致與Struts2 的報錯 日誌忽略 -->
        <logger name="com.opensymphony.xwork2.util.LocalizedTextUtil"
            level="warn"></logger>

大功告成: 我覺得第三種挺好.簡單 完美;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章