Struts2 2.1.x 升级到 struts2 2.3.x 中的冲突解决
进入 2018 年来,Struts2 又爆出漏洞,让程序员们头疼不已。因为这个漏洞貌似有点风险大,所以各个几年前用Struts2 开发的系统,恐怕都面临要必须更新的紧急任务。
但是,跑了几年的系统,谁都不敢轻举妄动。
笔者最近就遇到这个问题,但是,如果你不更新,公安局的网监是不会答应的,所以,笔者接到通知,二话不敢说,立即寻找解决办法。
过程异常艰辛,替换了更新后的新版 JAR 文件,各种冲突报错,应用启动不成功,因为对 Struts2 内部了解并不深刻,程序员的关注点永远都是用户的业务逻辑处理是否正确。框架存在的意义不就是为解放程序员吗?
笔者的系统是 Struts2 2.1.6,必须升级为 struts2 2.3.35。经过一天的周末加班,各种查各种试,终于在傍晚灵光一闪,找到了问题所在。现整理如下,供小伙伴们参考。
1. 到官网 http://mirrors.shu.edu.cn/apache/struts/2.3.35/struts-2.3.35-min-lib.zip 去下载 struts2 的最小核心包。记得一定要最小核心包,否则那么一大堆无用的 JAR 放在那里自己就先晕了;
2. 解压后发现,原来核心包只有这么 9 个 JAR 文件,嗯,心理压力小多了。
commons-fileupload-1.3.2.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
commons-logging-1.1.3.jar
freemarker-2.3.28.jar
javassist-3.11.0.GA.jar
ognl-3.0.21.jar
struts2-core-2.3.35.jar
xwork-core-2.3.35.jar
3. 然后,去自己的应用系统 LIB 目录去看,一一将同名 JAR 文件(仅版本号有差异)替换为新版本;
4. 重启应用。
5. 结果可能发现 TOMCAT 的输出窗口报 错:
严重: Actual exception
Caught Exception while registering Interceptor class org.apache.struts2.intercep
tor.debugging.DebuggingInterceptor - interceptor - jar:file:/E:/apache-tomcat-6.
0.41/apache-tomcat-6.0.41_test/webapps/bjac/WEB-INF/lib/struts2-core-2.3.35.jar!
/struts-default.xml:205:115
at com.opensymphony.xwork2.ObjectFactory.buildInterceptor(ObjectFactory.
java:202)
笔者就是在周末一天的时间里各种试的时候不停看到这个报错。这个好吓人。
莫慌!!看看你原来的 LIB 目录下,是否多了这么一个文件:xwork-2.1.2.jar, 这个文件是 xwork 的完整版本 JAR,STRUTS2 是在此基础上开发的。早期的版本 STRUTS2 打包时可能分开打的,将 xwork 的完整版本也单独一个 JAR 出来。到 STRUTS2 的 2.3.x 版本后,直接将 xwork 的必须的内容打包打在了 xwork-core-2.3.35.jar 中,这样,xwork 的完整版本 JAR 对应用就不是必须的了。
不必须也罢了,这个 xwork 的完整版本 JAR 包中有 配置文件,不同版本的配置文件纠缠在一起,各不兼容,所以启动时直接报错,系统拒绝启动。
所以,果断将 xwork-2.1.x.jar 文件删除,一切 OK,应用成功启动。
6. 号外:很多时候,版本之间跨度比较大的时候,你去访问你的应用,惊喜地发现能访问,证明应用确实启动成功了。
然后,你登录,结果看到这样类似的报错:
org.apache.commons.lang.exception.NestableRuntimeException
..................
仍然很吓人。
莫慌!这是语言包少 JAR 文件,将原始的语言 JAR 文件与新版本的并存,即可解决此问题。(比如,笔者是让自己应用的 lib 目录下同时包含两个语音 JAR:
commons-lang3-3.2.jar(新版本的语言JAR文件) 、commons-lang-2.5.jar(老版本的语言JAR文件) )
希望能帮到遇到此问题的朋友们!