您的位置:首页 > 运维架构 > Tomcat

解决Struts2.5配合Tomcat8出现could't clear cache问题(解决)

2016-12-11 23:18 369 查看

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属性。

寻找解决方案

看来是源码的问题,把容器换成tomcat7的确可以解决问题,可是身为一个强迫症泛滥的码农怎么受得了呢。

于是Github上翻看源码(fix地址),一个叫lukaszlenart的家伙已经提交了修复bug的代码。

重新编译struts

编译成功G:\struts-2.3.20\src\xwork-core里会出现一个target文件夹,拷贝替换工程里的xwork-core-2.3.20.jar,大工告成。

第三种方案: Log4j2: 配置不显示Struts2这个 类的 Debug信息, 只显示Warning以上级别的 :

方法如下 :

<!-- Tomcat 8 去掉一个属性,导致与Struts2 的报错 日志忽略 -->
<logger name="com.opensymphony.xwork2.util.LocalizedTextUtil"
level="warn"></logger>


大功告成: 我觉得第三种挺好.简单 完美;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息