为更好的适应JAVA技术的发展,使用更先进及前沿的技术。所以推出将我们现在使用的JDK1.6(1.7)及tomcat6(7)升级至JDK1.8及tomcat8,使我们的系统获得更好的性能,更好适应未来及节约成本

一、升级JDK8流程

1、服务器JDK版本升级
将JDK1.8版本安装到服务器上

2、老系统升级时专用流程
将老代码(1.6或1.7编译的)部署到升级的服务器上(JDK有向下兼容原则),灰度观察一段时间(但也有部分不兼容的内容)查看代码运行是否有问题

JDK不向下兼容部分:
https://www.oracle.com/java/technologies/compatibility.html

3、升级项目代码中的JDK
3.1、在项目主pom.xml文件中添加编译配置,如果存在“maven-compiler-plugin”则修改为如下配置:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.5.1</version><configuration><encoding>UTF-8</encoding><source>1.8</source><target>1.8</target></configuration>
</plugin>

3.2、若是我们的api的jar包被其他系统使用,则设置对外api包的pom.xml编译环境为原JDK版本

前提是其他系统使用的是比1.8低的版本。
如果其他系统版本低,是无法使用我们高版本编译的api的


3.3、其他modle里面如果也存在的话,则删除maven-compiler-plugin插件

3.4、修改项目JDK版本为1.8,在项目上”右键”选择“open module settings”,然后选择SDKs的“+”设置好JDK为1.8,并使用

3.5、选择左上角的File -》 settings打开对话框,在搜索框里面输入“java Compiler”选择,确保Target bytercode version 为1.8,并且API栏为原JDK版本

4、部署新代码
部署新代码(1.8编译的)部署到服务器上,灰度观察一段时间,查看代码运行是否有问题

二、升级过程中可能遇到的问题

一、JVM在JDK8的新特性
去除了永久代(PermGen),新增元空间(Metaspace);

永久代的参数-XX:PermSize和-XX:MaxPermSize也被移除了。如果在启用时设置了这两个参数,会被忽略并给出警告。在升级JDK8时如果使用了这两个参数需要注意,将其删除。

建议设置MetaspaceSize和MaxMetaspaceSize这2个参数,否则可能出现本地内存被占用完,导致进程被直接杀死
-XX:MetaspaceSize
-XX:MaxMetaspaceSize

可以通过以下链接对永久代的去除及元空间的添加进行初步的了解。
参考:
https://blog.csdn.net/zhushuai1221/article/details/52122880
https://blog.csdn.net/sczyh22/article/details/46662279
https://www.jianshu.com/p/69ccaab0add7

二、jar包有误(冲突或版本过低)
1、Invalid byte tag in constant pool: 18

原因:aspectjweaver包1.6版本太低,升级至1.8

<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.9</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.9</version>
</dependency>

2、java.io.IOException: invalid constant type: 18

原因:javassist包版本太低,jdk1.8只支持3.18及以上版本

三、JDK8与spring3.x不兼容,升级spring4.x
在使用JDK8 + spring3.1时,启动项目会报以下错误

java.beans.IntrospectionException:
type mismatch between read and write method。

原因:
Java 8强制类中的getter和setter必须具有相同的类型,项目中引用的权限依赖中的类AccessPath中的set,get方法类型不相同导致的

解决办法:
升级spring版本,目前项目升级到了4.x版本(例:4.1.6.RELEASE、4.3.18.RELEASE)

参考:
https://my.oschina.net/smzd/blog/611731
https://github.com/spring-projects/spring-framework/issues/17053

四、spring3.x升级Spring4.x时,web系统参数转换问题
问题:
升级Spring4.x后,参数转换不兼容spring4,如下图:

解决方案:
1、使用spring原生的org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
2、删除配置<property name="failOnUnknownProperties" value="false"/>
出参转JSON,用不到这个功能
3、Spring3使用的Jackson1.X;Spring4使用的是Jackson2.X;
因此升级4后,由于配置中原本声明objectMapper为1.X,自动注入MappingJackson2JsonView的也是1.X,造成导致转换异常,需要手动设置objectMapper的对象引用

<--Jackson1.X-->
<bean id="objectMapper" class="org.codehaus.jackson.map.ObjectMapper">
<property name="dateFormat" ref="dateFormat"></property>
<property name="serializationInclusion">
<util:constant
static-field="org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_NULL" />
</property>
</bean>
​
<--Jackson2.X-->
<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat" ref="dateFormat">
</property>
<property name="serializationInclusion">
<util:constant static-field="com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL"/>
</property>
</bean>

五、JDK8与Tomcat8的升级
升级到tomcat8遇到的问题,tomcat 启动起来了,但是应用不能正常访问,看日志如下报错

七月 19, 2019 10:21:49 上午 org.apache.catalina.core.StandardContext startInternal严重: One or more listeners failed to start. Full details will be found in the appropriate container log file
七月 19, 2019 10:21:49 上午 org.apache.catalina.core.StandardContext startInternal严重: Context [] startup failed due to previous errors

提示更多的详细信息在容器日志里,然而容器没有其他日志,需要增加容器默认日志配置,
查询tomcat8官网,得到如下信息,tomcat默认使用JULI作为日志输入,JULI是Apache Commons Logging的一个分支

按照官网提示增加如下配置,找到对应的日志文件

查看具体的异常信息,进一步解决问题:
后端接收不到前端提交的表单请求参数时,需要检查下Tomcat的maxPostSize配置:从apache-tomcat-7.0.63 开始,参数 maxPostSize 的含义就变了: 如果将值设置为 0,表示 POST 最大值为 0,不限制 POST 大小需要将值设置为 -1。在此版本之前设置为 0 表示不限制 POST 大小。

tomcat8 日志官网:
https://tomcat.apache.org/tomcat-8.5-doc/logging.html

六、spring5.X与velocity不兼容
Spring5.x不再支持velocity,如果前端已经使用velocity的话,请使用spring4.x

七、JDK6和JDK8类型推断与重载解析的差异
问题:
重载方法遇到返回结果类型为泛型时,对重载方法的选择上 JDK6和JDK8会有区别。有可能会出现调用错误的重载方法导致异常。

案例:
Spring的集合判空方法:org.springframework.util.CollectionUtils.isEmpty


JDK6正常,JDK8却会包转换异常

原因:
JDK8 中的类型推断与重载解析与JDK6有很大区别,JDK8调用isEmpty重载方法时选择重载方法错误报错。

差异解析:
https://blog.csdn.net/on_1y/article/details/50650014

解决:
方法一:手动设置引用类型接收泛型结果,再把类型传到重载方法中
方法二:不使用第三方工具,重写实现方法

八、JDK6和JDK8在配置中的listener问题
【若没有申请新机器,而是基于老版本直接升级。可能出现的问题】

问题描述:
切换tomcat8的时候,会提示找不到两个listener

java.lang.ClassNotFoundException: org.apache.catalina.core.JasperListener
java.lang.ClassNotFoundException: org.apache.catalina.mbeans.ServerLifecycleListener

问题原因:
(1) tomcat启动命令为

/export/servers/tomcat8.0.30/bin/startup.sh -config /export/Instances/o2o.afs.web/server1/conf/server.xml

(2)配置文件为原先tomcat6的配置文件,而tomcat8没有这两个listener
解决方式:
修改配置文件:手动修改 或 通过脚本修改

sed -i '/org.apache.catalina.core.JasperListener/d' /export/Instances/*/server1/conf/server.xml
sed -i '/org.apache.catalina.mbeans.ServerLifecycleListener/d' /export/Instances/*/server1/conf/server.xml
​
脚本含义:
sed -i(-i 修改文件)
'/org.apache.catalina.core.JasperListener(找到对应语句所在的行)
/d(d为删除)
' /export/Instances/*/server1/conf/server.xml (对该文件进行操作)

九、推荐JDK8版本
早期JDK1.8版本对lambda支持较差,存在jvm crash风险
请升级到JDK1.8.0_45及以上版本

------The End------

感谢大家看到最后,文章持续更新!欢迎大家指出我的文章的不足之处,也欢迎大家关注、收藏+分享

如果这个办法对您有用,或者您希望持续关注,也可以扫描下方二维码或者在微信公众号中搜索【码路无涯】

升级JDK8的坎坷之路相关推荐

  1. Windows 7镜像坎坷之路 - 都是Daemon Tools惹得祸

    最近Windows 7 RTM已经在MSDN等订阅上发布了,其实泄漏版也很多,但是始终没有序列号,正值获得序列号的好日子,吴慧锋也兴高采烈的做一个Windows 7系统镜像,一边日后重装系统更加方便. ...

  2. Java码农坎坷之路~单例抽象类接口

    一.单例设计模式(设计思想) 核心思想:在程序的运行中 该类的对象,不管怎么创建,始终保持有且只有一个该类的对象 编写单例的思路: 1.不让外界创建对象(私有化构造方法) 2.自己类内部 来创建这个底 ...

  3. 斗鱼坎坷上市路,未来的对手不仅仅只有虎牙

    作者:科科 出品:网易科技<态℃>栏目组 在现阶段中国直播行业版图上,最后一家直播重量级公司斗鱼终于在今晚成功上市. 开盘价报11.02美元/股,跌破发行价,最终收盘与发行价持平,报11. ...

  4. 分享:从win10家庭版升级到专业版,以及企业版转变为专业版的坎坷之路

    本文介绍关于本人前一周经过尝试并总结出来的从win10系统家庭版本的升级以及企业版转换专业版的小方法. 文章目录 一.前言 二.win10系统家庭版本的升级 三.企业版转换专业版 一.前言 技术更新迭 ...

  5. 原本要与Hinton当同事,最后被迫Bengio门下读博? | 独立研究员的坎坷之路

    The sun doesn't shine on us, let's not lose hope. 作者 | 陈彩娴 编辑 | 青暮 在机器学习领域,如果一位技术达人,拥有机器学习硕士学位,专业能力过 ...

  6. 原本要与Hinton当同事,最后被迫Bengio门下读博?| 独立研究员的坎坷之路

    The sun doesn't shine on us, let's not lose hope. 作者 | 陈彩娴 编辑 | 青暮 在机器学习领域,如果一位技术达人,拥有机器学习硕士学位,专业能力过 ...

  7. 一条公链的坎坷进化路 |链捕手

    2019年已经过了大半年,公链行业依然是那么地平淡无奇,没有爆款应用,也没有突破性技术,实在是令人揪心. 不过在表面的波澜不惊中,公链行业的玩家们都在发生翻天覆地的变动,它们曾苦苦寻找落地场景.争夺D ...

  8. 不关闭Selinux\Firewalld的情况下OpenSSH 9.0/9.1/9.2升级说明——筑梦之路

    前面写了一些文章,关于利用官方源码编译或者制作rpm包来升级openssh,修复安全漏洞 centos 7 制作openssh8.7/8.8/8.9/9.0 p1 rpm包升级--筑梦之路_筑梦之路的 ...

  9. 【坎坷求职路】:选择大于努力!一名六次反复经历失败的应届生,最后一刻跻身阿里如愿以偿

    背景 一个广州非985/211普通本科生,计算机科学与技术专业.以前老是梦想能考一个厉害一点的学府,学习物理专业(因为初中和高中对物理比较有兴趣),无奈高考考得不尽人意.来到了计算机专业,才知道有C语 ...

最新文章

  1. 客户端函数弹窗_前端常用的几种弹窗函数
  2. 多边形轮廓等比例缩放
  3. python与excel结合-Python与Excel 不得不说的事情
  4. ajax: PopupControlExtender使用
  5. 计算机IO系列「零」计算机IO【硬件部分】
  6. 使用 CocoaPods 对公有库开源和私有库组件
  7. 基于TCP和多线程实现无线鼠标键盘-Socket(2)
  8. linux内核--设备驱动程序(学习笔记)
  9. [2013.9.10]vb.net坑爹的数组
  10. 如何在虚拟linux环境运行python_linux下使用virtualenv虚拟独立python环境
  11. NSUserDefaults 添加与删除
  12. SAP打印出库单需求
  13. linux关于子网掩码函数,Linux 子网掩码计算, 二进制十进制互相转换
  14. Dev C++ 源文件编译时,确实没问题,但是运行时,总是提示源文件 未编译
  15. 这是一个猜数字的游戏。判断输入的第1个字符,略过其余的字符。
  16. Kotlin协程createCoroutine和startCoroutine原理
  17. 雅思备考-口语词组积累-第三章
  18. 深圳企业选择深圳SEO外包的理由
  19. Vue3答题问卷H5实战
  20. windows驱动开发环境搭建以及helloworld

热门文章

  1. java面试宝典2017
  2. 木子-前端-谷歌页面等调试时总是报No Found 404 错误(编码格式不识别问题导致的)
  3. 02 FinalReference.referent的回收时机
  4. 对项目经理而言,PMP是否对职业生涯的发展有帮助?
  5. 用js实现自动获取身份证里面的信息
  6. 微信的服务器 上海,微信团队:上海机房服务器发生故障 个人账号安全暂不受影响...
  7. 用GO语言编写一个简单的区块链
  8. 2021.04.09丨使用featurecount进行定量处理
  9. Mysql出租车轨迹的分析_一种基于出租车轨迹数据的交通出行共现现象的可视化分析方法与流程...
  10. 社会工程学与APT攻击之——社工防御方法