struts2.3.2的Bug
昨天用struts框架做一个小项目,Console莫名其妙报出一下错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
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
既然有人fix了代码,把源码下下来再编译一个新的xwork-core-2.3.20.jar那么就OK了。下面编译struts要用到Maven(Maven官网)。解压安装包。
设置Maven环境变量
1) MAVEN_HOME=G:\apache-maven-3.3.1
2) PATH=%MAVEN_HOME%\bin
cmd里测试一下是否安装成功mvn -version
编译xwork-core
进入G:\struts-2.3.20\src\xwork-core(根据自己的目录修改)目录输入
mvn package -Dmaven.test.skip=true
编译成功G:\struts-2.3.20\src\xwork-core里会出现一个target文件夹,拷贝替换工程里的xwork-core-2.3.20.jar,大工告成。