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

产品环境升级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不是保持向下兼容的嘛?为什么升级以后其他的应用也需要变化呢。。当然部分注解有不同的策略

相关推荐

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...

    jdk1.6 和jdk1.8

    总的来说,从JDK 1.6到JDK 1.8,Java平台经历了许多重要的演进,这些变化旨在提高开发者的生产力,简化代码,同时增强程序的性能和稳定性。无论是在项目选择上还是学习路径上,了解这些版本间的差异对于Java开发者来...

    jdk免安装版jdk1.6 jdk1.7 jdk1.8

    ### 描述解析:“jdk免安装版包含jdk1.6 jdk1.7 jdk1.8,解压配置下环境变量就可以用。真测可用” 这段描述进一步解释了免安装版JDK的具体使用方式:用户只需下载对应的压缩文件,解压缩后设置好必要的环境变量即可...

    JDK1.6和1.8合集

    **JDK 1.6 和 1.8 合集** Java Development Kit(JDK)是Oracle公司发布的用于开发和运行Java应用程序的软件工具包。这个合集包含了JDK的两个重要版本:JDK 1.6(也称为Java SE 6)和JDK 1.8(Java SE 8)。这两个...

    jdk1.6、1.7、1.8的local_policy.jar和US_export_policy.jar

    当你需要在JDK 1.6、1.7 或 1.8 中使用192位和256位AES加密时,可能会遇到“非法关键字”或“不受支持的密钥大小”等错误。为了解决这个问题,你需要替换JRE目录下的 `local_policy.jar` 和 `US_export_policy.jar`...

    jdk1.6_jdk1.8

    本文将详细探讨JDK1.6和JDK1.8这两个重要版本,以及它们的关键特性。 首先,JDK1.6,也被称为Java SE 6,于2006年发布。它是Java历史上的一个重要里程碑,引入了多项改进和新功能,旨在提高性能、稳定性和可管理性...

    jdk1.6.1.7.1.8

    jdk1.6和jdk1.7的32位和1.7的64位和jdk1.8,只打包了这三个目前比较常用的。

    jdk1.6-jdk1.8

    这里我们关注的是从JDK1.6到JDK1.8的版本升级,这个过程涉及到一系列的改进和新特性,对于开发者来说是重要的知识节点。 首先,JDK1.6,也被称为Java SE 6,发布于2006年,引入了许多增强和新特性。其中,一项重要...

    jdk1.6-1.8和jre1.6-1.8

    总结来说,JDK 1.6到1.8的演变展示了Java技术的持续发展和改进,包括语言特性、性能优化和API扩展。对于开发者而言,了解这些版本的差异和特性有助于选择适合项目需求的Java环境。而JRE则是部署Java应用程序的基础,...

    Java SE API JDK 1.6中文版以及1.8英文版

    本篇将深入探讨JDK 1.6中文版和1.8英文版中的关键知识点。 1. **Java虚拟机(JVM)** - JVM是Java程序执行的基础,它负责解释并执行字节码,实现跨平台的"一次编写,到处运行"特性。 - JDK 1.6引入了增强的垃圾...

    64位 jdk1.6,1.7和1.8合集

    在标题中提到的“64位 jdk1.6,1.7和1.8合集”是一个集合,包含不同版本的64位JDK,分别是1.6、1.7和1.8。这些版本对于理解Java的历史发展和不同阶段的技术特性至关重要。 JDK 1.6,也被称为Java SE 6,于2006年...

    jdk1.6集成jjwt的问题

    标题中的“jdk1.6集成jjwt的问题”指的是在Java Development Kit (JDK) 版本1.6的环境下,尝试整合JSON Web Token (JWT) 库jjwt时遇到的挑战。JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 ...

    JDK1.4 JDK1.5 JDK1.6 JDK1.7 JDK1.8

    JCE无限制权限策略文件,下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。将两个jar文件放到%JDK_HOME%\jre\lib\security下覆盖原来文件,记得先备份

    苹果电脑安装jdk1.6 mac for jdk1.6 jdk6 安装版

    mac for jdk1.6 jdk6 安装版 里面有两个jdk1.6的安装包,都可以用 如果电脑上安装有1.7,1.8等高版本jdk就不要再下安装包了,安装包安装会报错 命令是这个:brew install java6或 brew install homebrew/cask-...

    tomcat8.5.20+jdk1.7或jdk1.8或jdk1.6

    3. 阅读Tomcat官方文档:了解与所选JDK版本相关的配置调整和注意事项,避免遇到兼容性问题。 综上所述,Tomcat 8.5.20与JDK 1.7和1.8是良好的搭配,可以充分利用Java的新特性,提高开发和运行效率。然而,考虑到JDK...

    JDK大全 JDK1.6 JDK1.7 JDK1.8 JDK1.9 JDK10 JDK11 JDK12 JAVA SDK

    Java Development Kit(JDK)是Java编程语言的核心组件,它包含了一个Java运行环境(JRE)、编译器(javac)、各种工具(如jar、javadoc等)以及Java类库,使得开发者能够编写、编译、调试和运行Java程序。JDK的不同...

    dm8-jdbc 达梦8连接jdbc、Hibernate的 对应jdk1.6、1.7、1.8jar包

    标题"dm8-jdbc 达梦8连接jdbc、Hibernate的 对应jdk1.6、1.7、1.8jar包"表明这是一个关于达梦数据库(DM8)与Java应用程序交互的资源集合。其中,'dm8-jdbc'是DM8的Java数据库连接(JDBC)驱动程序,它允许Java应用...

    256位密钥的AES加解密工具(jce_policy-jdk1.6&1.7&1.8合辑)

    因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制。比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件。 替换的文件:%JDK_HOME%\jre\lib\security\local_policy.jar 详细...

    JDK1.6下的Base64解决方式.txt.zip

    本文将详细解释如何在JDK 1.6环境下解决Base64编码和解码的问题。 首先,JDK 1.8及更高版本引入了`java.util.Base64`类,提供了完整的Base64编码和解码功能。但在JDK 1.6中,我们需要依赖第三方库来实现这一功能。...

    JDK1.6、1.7、1.8 、1.9中文版API(全).rar

    本资源包含了JDK1.6、1.7、1.8和1.9四个重要版本的中文版API文档,这对于Java开发者来说是一个极其宝贵的参考资料。 JDK1.6,也被称为Java SE 6,是在2006年发布的。此版本引入了多项改进和新特性,例如增强的Swing...

Global site tag (gtag.js) - Google Analytics