`
xiaoshao
  • 浏览: 49860 次
社区版块
存档分类
最新评论

产品环境升级JDK1.6 到JDK1.8遇到的各种问题

 
阅读更多

最近在做了一个将JDK1.6升级到JDK1.8的一个task,这里跟大家分享一下我们在做这个task过程中遇到的各种问题。

        首先描述一下我们在JDK1.6中所使用的各种组建,产品原来的框架选择的是Spring3.x,同时使用了HttpClient4.x,还有我们构建环境使用的是gradle 1.9。因为我们只是尝试升级,所以要保证build.gradle在JDK 1.6 和1.8下都可以运行。所以决定在运行使加入toggle -Pjava8标记是运行在1.8环境下,没有则表示运行在1.6环境下(hasProperty("java8"))。

 

    在JDK1.8环境下需要升级以下组建,

       (1)升级Spring3.x --> Spring 4.x  (**之后查阅Spring官网资料发现Spring4.x的发布就是为了支持JDK1.8,不过其同时修正了Spring3.2.3,使其也可以在JDK1.8下运行。)

       (2)升级ASM3.x--> 5.x(**查阅ASM官网发布日志发现ASM自2013年10月发布5.0-BETA版为了支持JDK1.8)

 

升级完这些之后,发现出现了一个编译错误,Spring org.springframework.cache.Cache添加了两个抽象方法(get和putIfAbsent),因为这两个方法在之前的系统中没有使用过,所以决定实现这两个方法,不过抛出UnsupportException。可是为了保证可以在JDK1.6下可以编译通过所以注释了@override标签。

 

  编译通过后,尝试运行Unit test(gradle test, urlTest, inTest)发现字节码错误,搜索资料发现JDK1.8中有几个小版本存在字节码Verify的Bug,所以在运行Unit test时加入 JVM参数 -noverify,取消字节码验证。

 

 再次运行Unit test,又出现了一个Spring Bean的注入错误。原来,项目中引入了google的一些jar文件,所以在Spring注入的时候选择了XML配置(配置需要依赖google jar文件中的类)和@autowire两种注入方式。

   搜索资料后发现,在Spring3.x和4.x中@autowire按照如下方式查找bean,

      1)首先按照Type在container中查找,如果只有一个那么就按照type注入

       2)如果有多个实例,就按照name再次过滤,如果按名字可以匹配,那么就按照name注入

       3)如果按照名字或者类型都匹配不到,那么就抛出异常。

按照这样的解释,我们的程序是可以正常执行的,这一点让我们百思不得其解,最后我们按照加入了@Qualifier标签,虽然解决了这个问题,可是我们直到现在还没有想到到底是因为什么。

 

在解决了这些问题之后我们的所有测试就可以正常运行了。

我们暂时可以尝试在Staging服务器上试运行了。

 

2
2
分享到:
评论
3 楼 xiaoshao 2015-01-27  
bitray 写道
jdk不是保持向下兼容的嘛?为什么升级以后其他的应用也需要变化呢。。当然部分注解有不同的策略

至今我们的环境上在运行的时候还有一个参数-noverify,这个参数是非常不好的,客户建议我们把这个参数干掉,可是,我们调查了很多天了,还是不能去掉。 去掉之后就会出现 stacktable is required.等错误。总之就是字节码验证不能通过。
2 楼 xiaoshao 2015-01-27  
bitray 写道
jdk不是保持向下兼容的嘛?为什么升级以后其他的应用也需要变化呢。。当然部分注解有不同的策略

JDK是向下兼容,但是因为JDK1.8的改动比较大,引入了lambda等许多新的东西,其实在jdk7的时候,就已经出现了很多问题,例如verify等问题,你可以在google上搜索一下,许多升级到JDK7的时候都出现了这个问题verifyerror。
1 楼 bitray 2015-01-22  
jdk不是保持向下兼容的嘛?为什么升级以后其他的应用也需要变化呢。。当然部分注解有不同的策略

相关推荐

Global site tag (gtag.js) - Google Analytics