【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
因公司业务发展,将jdk1.6升级至1.8,tomcat6升级至8。因老项目使用struts2.3.20版本,使用velocity模板渲染,需针对此框架整体升级至struts2.5.x,spring4.x。
注:struts2.5.x适用jdk1.7及以上。
1、更新项目maven包。struts2-core,struts2-json-plugin,struts2-spring-plugin及其余引用版本。删除原低版本引用,例如 :xwork-core (2.5版本 struts内置引用了新版 ),保证只有单一新版,防止冲突。
2、修改web.xml。删掉标红的ng. 。
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
3、修改struts.xml文件头部信息标红部位,修改为新的大版本数值,此处使用2.5.x,因此为2.5
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">
4、应用内使用了struts的标签,需要对应调整,可参考官网或百度谷歌查看变更点。
5、2.5.x的Struts默认不能修改action的访问后缀,无法通配方式调用action方法,需添加
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<constant name="struts.enable.SlashesInActionNames" value="true"/>
使得<constant name="struts.action.extension" value="do" />可以生效
6、<package name="mypackage" namespace="/" extends="struts-default" strict-method-invocation="false"> 注意这里添加了strict-method-invocation="false"
7、原版本的struts的版本小于等于2.3,且项目进行动态方法配置,可在全局中添加<global-allowed-methods>regex:.*</global-allowed-methods>
8、报错: java.lang.NoSuchMethodError: org.springframework.aop.scope.ScopedProxyUtils.isScopedTarget(Ljava/lang/String;)
对应的 spring-aop 版本低,需升级。如应用引用了struts2-spring-plugin,升级此包,直接使用此包内引用的版本即可,去除其余版本
9、java.lang.IncompatibleClassChangeError: class org.apache.struts2.convention.DefaultClassFinder$InfoBuildingVisitor has interface org.objectweb.asm.ClassVisitor as super class
遇到类似的Error:xxx as super class,基本都是jar包冲突导致,查看具体包冲突信息,去除多余版本的引用。此处为asm低版本,导致部分action无法使用。当使用低版本struts搭配高版本jdk时也会出asm,和xstrem的错误。
参考链接:https://www.codercto.com/a/36906.html
具体问题出在:
private void readClassDef(String className) { if (!className.endsWith(".class")) { className = className.replace('.', '/') + ".class"; } try { URL resource = classLoaderInterface.getResource(className); if (resource != null) { InputStream in = resource.openStream(); try { ClassReader classReader = new ClassReader(in); classReader.accept(new InfoBuildingVisitor(this), ClassReader.SKIP_DEBUG); } finally { in.close(); } } else { throw new XWorkException("Could not load " + className); } } catch (IOException e) { throw new XWorkException("Could not load " + className, e); } }
10、java.lang.NoSuchMethodError: org.apache.commons.lang3.reflect.MethodUtils.getMethodsListWithAnnotation(Ljava/lang/Class;Ljava/lang/Class;ZZ)Ljava/util/List;
升级 commons-lang3 版本,或去除其余包内低版本引用,使用内置的。
11、java.lang.RuntimeException: java.io.IOException: invalid constant type: 18
dubbo 使用低版本 javassist 会报的错,同时 javassist 3.18以下的版本不支持在JDK1.8下运行 。升级<groupId>org.javassist</groupId><artifactId>javassist</artifactId>版本即可。
12、 Spring 版本 4.x 以上,已经放弃了对velocity的支持。使用runtime.log.logsystem.class=org.springframework.ui.velocity.CommonsLoggingLogSystem做日志输出,访问时会报classnotfound异常,需手动将velocity对应的工具类手动添加至项目中。调整配置runtime.log.logsystem.class至本地xxx.xxx.xxx.CommonsLoggingLogSystem
来源:oschina
链接:https://my.oschina.net/u/3087155/blog/3154980