java.lang.NoSuchFieldException: resourceEntries at java.lang.Class.getDeclaredField(Class.java:1901) at com.opensymphony.xwork2.util.LocalizedTextUtil.clearMap(LocalizedTextUtil.java:877) at com.opensymphony.xwork2.util.LocalizedTextUtil.clearTomcatCache(LocalizedTextUtil.java:857) ...
Struts2 LocalizedTextUtil.clearTomcatCache() 嘗試通過反射訪問 Tomcat 類加載器的 resourceEntries 欄位以清理緩存。代碼邏輯:
Class cl = loader.getClass();
if ("org.apache.catalina.loader.WebappClassLoader".equals(cl.getName())) {
clearMap(cl, loader, "resourceEntries"); // Tomcat 7 有此欄位
} else if ("org.apache.catalina.loader.WebappClassLoaderBase".equals(cl.getSuperclass().getName())) {
clearMap(cl.getSuperclass(), loader, "resourceEntries"); // 嘗試父類
}
Tomcat 8 重構類加載器:WebappClassLoaderBase 中**移除了 resourceEntries 欄位**,導致反射拋出 NoSuchFieldException。
LocalizedTextUtil 移除對 resourceEntries 的反射調用,重新編譯替換 JAR(利用開源優勢)。Tomcat 7 WebappClassLoader 含 resourceEntries;Tomcat 8 WebappClassLoaderBase 無此欄位。升級框架為正解。