升级JDK8的坎坷之路
为更好的适应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重载方法时选择重载方法错误报错。
解决:
方法一:手动设置引用类型接收泛型结果,再把类型传到重载方法中
方法二:不使用第三方工具,重写实现方法
八、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的坎坷之路的更多相关文章
- python运维开发坎坷之路-01
前言 2014年9月,新疆乌鲁木齐,在51CTO学院看着alex老师的python教学视频,不得不说这是我第一次接触python这门高级语言,从最开始的一无所知到现在能够用python写脚本,再到未来 ...
- 关于CefSharp的坎坷之路
项目背景: 公司的XX产品需要升级和以后支持多平台的使用.因为之前项目是由WPF实现的.目前以后想作为Html5来展示页面. 因为涉及到整体更改遇到的问题较多以及其他原因,所以只是内部内容区域先替换为 ...
- 自学java坎坷之路——20155312张竞予
20155312 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 第一周并没有在课堂上对教材内容进行学习,学习内容概括如下 课程分数构成,其中包括课堂测验(每 ...
- VueJS坎坷之路222--vue cli 3.0引入静态文件
前两天准备搭建一个vue小项目,当引入jquery脚本的时候一直找不到引入的文件: 在网上搜了好多vue添加静态文件的方法,发现大多数方法都是创建一个与文件夹src同等级的文件夹static存放引入的 ...
- VueJS坎坷之路111---_self.$scopedSlots.default is not a function
VueJs + Element 话不多说,直接贴错: _self.$scopedSlots.default is not a function <el-table stripe border r ...
- python3.6和pip3:Ubuntu下安装升级与踩坑之路
本文以Ubuntu16.x系统为例,演示如何安装python3.6和相应环境.安装Python3的机器必须要能访问外网才能进行如下操作! 1. 安装方式 在Ubuntu下安装python有两种方式: ...
- 半年收入超2亿RMB 独立游戏开发者的艰苦创业路
一款叫做<监狱建筑师>的模拟经营游戏,目前在Steam平台获得了3000万美元(近2亿元)以上的收入.这款游戏由英国独立工作室Introversion Software发布,而团队最困难的 ...
- Winform下CefSharp的引用、配置、实例与报错排除(源码)
Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfrom项目.引用CefSharp的方法,演示了winfro ...
- CefSharp的引用、配置、实例
CefSharp的引用.配置.实例与报错排除(源码) Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfro ...
随机推荐
- 链式调用+对象属性与遍历+this指向+caller/callee
之前的作业: 提示: 在开发的时候尽量在函数内部将作用都给调用好,在外部就能够直接使用 链式调用: 正常这样是不行的,因为没有具体返回值: return 具体的对象,这样的才是链式操作,jquery ...
- IDL读取fits文件
使用mrdfits函数 这是天文学标准库中的函数,下载地址:https://idlastro.gsfc.nasa.gov/homepage.html,下载后,将pro文件夹导入到IDL工程中. str ...
- Faster RCNN 改进论文及资料
1,面向小目标的多尺度Faster RCNN检测算法 黄继鹏等 对高分辨率图像进行下采样和上采样,使得网上获取的数据与实际测试数据分布接近. 下采样:最大池化和平均池化 上采样:线性插值,区域插值,最 ...
- python爬虫与mysql,mongobd(1)(2)第一个视频python_pymysql 安装与使用类型,import解决 问题之模块引ru 就是解决你的问题
import pymysql.cursors ''' 1.创建连接 2.创建游标 3.执行sql 5.接受结果 ''' # 1.连接 connection =pymysql.Connect( # 域名 ...
- 鸿蒙内核源码分析(内存管理篇) | 虚拟内存全景图是怎样的 | 百篇博客分析OpenHarmony源码 | v12.04
百篇博客系列篇.本篇为: v12.xx 鸿蒙内核源码分析(内存管理篇) | 虚拟内存全景图是怎样的 | 51.c.h .o 内存管理相关篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有 ...
- Linux虚拟机配置静态ip地址
使用VMware搭建的虚拟机ip地址经常变动,在这里记录一下虚拟机设置静态ip地址: 首先通过VMware菜单栏编辑->虚拟网络编辑器->NAT设置查看子网ip地址和网关ip: 例如我这里 ...
- 洛谷1501 Tree II(LCT,路径修改,路经询问)
这个题是一个经典的维护路径信息的题,对于路径上的修改,我们只需要把对应的链\(split\)上来,然后修改最上面的点就好,注意pushdown的时候的顺序是先乘后加 然后下传乘法标记的时候,记得把对应 ...
- 阿里P8面试官:如何设计一个扛住千万级并发的架构?
大家先思考一个问题,这也是在面试过程中经常遇到的问题. 如果你们公司现在的产品能够支持10W用户访问,你们老板突然和你说,融到钱了,会大量投放广告,预计在1个月后用户量会达到1000W,如果这个任务交 ...
- 2020.3.28-ICPC训练联盟周赛,选用试题:UCF Local Programming Contest 2016
A.Majestic 10 签到题. #include<iostream> #include<cstdio> #include<cstring> #include& ...
- pandas 取 groupby 后每个分组的前 N 行
原始数据如下: (图是从 excel 截的,最左1行不是数据,是 excel 自带的行号,为了方便说明截进来的) 除去首行是标题外,有效数据为 28行 x 4列 目前的需求是根据 partition ...