spring2.5.6+java6升级到spring4+java8了
背景
有些产品开发时间较早,使用的技术栈还是spring2.5.6+java6。这个技术栈存在几个问题
java8相对java6做了很多性能优化,这些年陆陆续续遇到一些java6相关的性能问题,比如java的ClassLoader用的是方法级的,而java7就已经在中提供了一类一锁。
java8的语法相对java6来说更便捷,生产效率更高。
国外主流开源项目很多都只提供java8以上的SDK,一旦出现非升级不可的情况,将是灾难性后果。像今年出现的多次的安全漏洞,如果不是温少照顾中国国情,也只提供java8的sdk,很多项目组将会付出惨痛代价
目前成研负责的是全国最多法院在用的核心办案系统,为了让团队成员效率更高,法官们用的更爽,同时避免后续出现无法升级开源项目SDK的窘境,NP将尝试将spring和java进行升级。
升级方案
基于spring2.5.6源码进行改造
网上提到的方案都是定制一下spring的这个类,用这种方案只是说你的程序能在运行起来,但是无法用到的新语法,因为spring2.5.6是不支持表达式的,spring在启动时会报错。

也有人给提了相应问题,希望spring官方能让spring2.5.6支持java8,官方的答复是哪凉快哪呆着去。既然官方不干,那我可以试着代官方行事,修改一个支持java8的spring2.5.6版本。
结合上述报错信息,我就把的代码拿出来进行修改,但是经过两个小时的努力,发现这个工作量不小。先舍弃这种方案。
直接将spring2.5.6升级到spring4.XX
spring4.XX是官方支持java8的最小版本。跨两个大版本升级,心里还是有些没底的。但是经过三个小时的努力,终于成功的将NP升级到。在升级过程中,陆续出现了十多个错误,但基本上没有改代码,只是各种升级jar包和修改配置。以下是升级中出现的错误和相应的解决方案。
bouncycastle循环依赖
Caused by: java.lang.IllegalStateException:
Unable to complete the scan for annotations for web application [/spxt] due to a StackOverflowError.
Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.
The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector
->org.bouncycastle.asn1.DEREncodableVector
->org.bouncycastle.asn1.ASN1EncodableVector]
这个是出现了jar包冲突,只是以前spring2.5.6的时候没报错,spring4.XX更加严格了。删除重复的jar包,我只保留了,也可以考虑升级到更新的版本
各种ClassNotFoundException
Caused by: java.lang.ClassNotFoundException: org.springframework.scheduling.quartz.JobDetailBean
这个类改名了,改成
ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean 这个类改名了,改成
NoClassDefFoundError: org/apache/neethi/PolicyBuilder
升级neethi到3.1.1.jar
Requested bean is currently in creation: Is there an unresolvable circular reference?
spring的bean出现了循环依赖,以前有循环依赖的话,spring2.5.6会想办法兼容解决,但是其实也遗留了很多隐患,NP深受其害。个中原由略去不讲,大家在程序设计时,要好好设计,不要出现bean的循环依赖。
如果不重构代码的话,可以在bean的申明时加一个@Lazy的注解,这样A依赖B,B依赖A的话,把B这个bean设为懒加载。
ClassFormatException Invalid byte tag in constant pool: 18
Caused by: org.aspectj.apache.bcel.classfile.ClassFormatException: File: 'com.thunisoft.XXXService': Invalid byte tag in constant pool: 18
at org.aspectj.apache.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:192)
at org.aspectj.apache.bcel.classfile.ClassParser.parse(ClassParser.java:131)
at org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository.loadJavaClass(NonCachingClassLoaderRepository.java:262)
at org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository.loadClass(NonCachingClassLoaderRepository.java:242)
at org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository.loadClass(NonCachingClassLoaderRepository.java:249)
升级aspectJ到解决
hibernate相关问题
hibernate升级到,这个版本相对项目中用到的3.2.6改动很小,如果升级到hibernate4或者5的话,改动量会很大。升级hibernate时遇到了一些小问题,比如项目中重写了的,hibernate3.6.10改了这个类,所以如果用到了的话需要改一行代码。
Caused by: java.sql.SQLException: Incorrect syntax near 'cross'.
我们用的是sybase数据库,改一下hibernate方言,用这个方言。
cxf升级
项目中用到了cxf2.XX,和spring4不兼容,统一升级到cxf3.0.1版本解决。中间也遇到了一些小的配置问题。比如这个配置要删掉,高版本没有这个文件了。
还有,这个是升级
然后项目就跑起来啦,当他跑
后记
还有一些项目特有的问题就不一一描述了,每次遇到一个错就解决一个错,再重启验证,就这么来回十几次,当我最后一次发现控制台没有错误信息的时候,这种喜悦只有写代码的人才能感受到。我小心翼翼的打开浏览器,输入网址,运行,页面加载的那三秒钟是今年最长的三秒钟,但是一切还好,老天没有耍我。
十年前我刚入职时,按照架构师写的文档把项目框架搭建起来,十年过去了,我又来改NP代码了。本来这事轮不到我的,找了好几个人,都说不好升级,工作量大。以后大家要慎重点哦。