【JDK 11】【JDK 8】项目 jdk 版本升级,修改方案与实践

前言

工作中,难免会遇到升级版本的事情。这次由于两个系统中,系统 A 是用的 JDK8 版本,系统 B 是用 JDK11 版本;要求同步 JDK 版本,也就是升级到11版本。那么接下来将进行介绍~

问题与解决

1. .sh 脚本启动无法启动问题

发现的问题

由于脚本改动并没有什么变化,启动 jdk8 不存在问题能启动成功,启动 jdk11 却无法启动。

JVM 参数 -XX:PermSize、参数 -XX:MaxPermSize、参数 -XX:+PrintGCDateStamps

导致的原因

(1) JDK 11 已经弃用-XX:PermSize 参数和 -XX:MaxPermSize 参数,从而会存在导致启动失败。
(这两个参数在 JDK 8 及之前版本被用来设置永久代内存的初始大小和最大大小。)

(2) -XX:+PrintGCDateStamps这个参数在 JDK 8 和 JDK 9 中都是支持的,但在之前的版本中可能会出现不支持的情况。(注:是 -XX:+PrintGCDateStamps 不是 PrintGCDetails

解决的办法

(1) ① 去掉 -XX:PermSize 参数和 -XX:MaxPermSize 参数。
② 在 JDK 11 上使用 -XX:MetaspaceSize 参数和 -XX:MaxMetaspaceSize 代替-XX:PermSize 参数和 -XX:MaxPermSize 参数.
(注:JDK 11 中-XX:MetaspaceSize 参数和 -XX:MaxMetaspaceSize 参数是设置元空间内存的大小。)
(2) 去掉 -XX:+PrintGCDateStamps 这个参数。

2. javafx.util.Pair 替换

发现的问题

启动项目的时候,出现 Error:(27, 19) java: 程序包javafx.util.Pair不存在

导致的原因

JDK 11 已经没有内嵌 javafx

解决的办法

(1) 如果是只有使用 javafx.util.Pair,可以用其他引入的依赖去代替。(如 cn.hutool.core.lang.Pair 等其他)
(2) 项目引入 JavaFX 的相关依赖。

【引入 JavaFX 的相关依赖】(点击展开)
<dependencies><dependency><groupId>org.openjfx</groupId><artifactId>javafx-controls</artifactId><version>11</version></dependency><dependency><groupId>org.openjfx</groupId><artifactId>javafx-fxml</artifactId><version>11</version></dependency>
</dependencies>

3. sun.misc.BASE64Decoder 替换

发现的问题

启动项目的时候,出现 Error:(5, 16) java: 程序包sun.misc不存在

导致的原因

JDK 9 之后已经删除和弃用 sun.misc

解决的办法

(1) 如果是需要替换sun.misc.BASE64Decoder,可以考虑 java.util.Base64代替掉 sun.misc.BASE64Encodersun.misc.BASE64Decoder

【sun.misc.BASE64Decoder 替换 java.util.Base64 实例】(点击展开)
import org.apache.commons.lang3.StringUtils;
import sun.misc.BASE64Decoder;import java.util.Base64;/*** TODO:升级 jdk11 替换 被弃用 base64 示例** @Author: nanfangzhe* @DateTime: 2023/6/1 20:10**/public class Base64Utils {public static void main(String[] args) {String txt = "南方者";try {String oldEncode = OldBase64Decode.base64Encode(txt.getBytes());System.out.println("sun.misc.BASE64Decoder Encode:" + oldEncode);String newEncode = NewBase64Decode.base64Encode(txt.getBytes());System.out.println("java.util.Base64 Encode:" + newEncode);byte[] oldBytes = OldBase64Decode.base64Decode(oldEncode);System.out.println("sun.misc.BASE64Decoder Decode:" + new String(oldBytes));byte[] newBytes = NewBase64Decode.base64Decode(newEncode);System.out.println("java.util.Base64 Decode:" + new String(newBytes));} catch (Exception e) {e.printStackTrace();}}}// jdk 8之前的版本
class OldBase64Decode {/*** TODO:Decode*/public static byte[] base64Decode(String txt) throws Exception {if (StringUtils.isBlank(txt)) {return null;}byte[] bytes = new BASE64Decoder().decodeBuffer(txt);return bytes;}/*** TODO:Encode*/public static String base64Encode(byte[] bytes) {return Base64.getEncoder().encodeToString(bytes);}
}// jdk11版本
class NewBase64Decode {/*** TODO:Decode*/public static byte[] base64Decode(String txt) throws Exception {if (StringUtils.isBlank(txt)) {return null;}byte[] bytes = Base64.getDecoder().decode(txt);return bytes;}/*** TODO:Encode*/public static String base64Encode(byte[] bytes) {return Base64.getEncoder().encodeToString(bytes);}
}

要点

由于不过于纠结 JDK11 版本升级 弃用删除了哪些方法或者哪些类不再内嵌。最快的方法是直接修改版本后,启动再发现缺失的东西,再进行替换、去掉、或者其他依赖方法进行处理。

  1. 修改 JDK 版本
    image.png
    image.png
  1. 直接启动,等待缺少需要
    image.png

总结

本篇文章介绍了, jdk8 升级 jdk11 的一些注意问题。主要围绕-

  1. .sh 脚本启动无法启动问题
  2. javafx.util.Pair 替换
  3. sun.misc.BASE64Decoder 替换
  4. … (后续碰到会持续更新)

(主要要点:)

文章小尾巴

【文章小尾巴】(点击展开)

文章写作、模板、文章小尾巴可参考:《写作“小心思”》
  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
   我是南方者,一个热爱计算机更热爱祖国的南方人。
  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/52650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM | 从类加载到JVM内存结构

引言 我在上篇文章&#xff1a;JVM | 基于类加载的一次完全实践 中为你讲解如何请“建筑工人”来做一些定制化的工作。但是&#xff0c;大型的Java应用程序时&#xff0c;材料&#xff08;类&#xff09;何止数万&#xff0c;我们直接堆放在工地上&#xff08;JVM&#xff09;…

死锁的发生原因和怎么避免

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 死锁&#xff0c;简单来说就是两个或者两个以上的线程在…

WebGL Shader着色器GLSL语言

在2D绘图中的坐标系统&#xff0c;默认情况下是与窗口坐标系统相同&#xff0c;它以canvas的左上角为坐标原点&#xff0c;沿X轴向右为正值&#xff0c;沿Y轴向下为正值。其中canvas坐标的单位都是’px’。 WebGL使用的是正交右手坐标系&#xff0c;且每个方向都有可使用的值的…

【物理】带电粒子在磁场和电场中移动的 3D 轨迹研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

轻松搭建酒店小程序

酒店小程序的制作并不需要编程经验&#xff0c;只需要按照以下步骤进行操作&#xff0c;就能很快地搭建自己的小程序商城。 第一步&#xff0c;注册登录账号进入操作后台&#xff0c;找到并点击【商城】中的【去管理】进入商城的后台管理页面&#xff0c;然后再点击【小程序商城…

Java on Azure Tooling 6月更新|标准消费和专用计划及本地存储账户(Azurite)支持

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 工具的六月更新。在本次更新中&#xff0c;我们将介绍 Azure Spring Apps 标准消费和专用计划支持以及本地存储账户&…

RFID资产管理系统的选择

RFID资产管理是一种有效的资产过程控制方法&#xff0c;可以帮助企业实现高效的资产管理。选择RFID技术&#xff0c;可以高度集成各种资产信息&#xff0c;完成实时跟踪管理。   根据RFID资产管理系统&#xff0c;可以做到资产的实时管理&#xff0c;使企业管理者可以实时了解…

微信小程序iconfont真机渲染失败

解决方法&#xff1a; 1.将下载的.woff文件在transfonter转为base64&#xff0c; 2.打开网站&#xff0c;导入文件&#xff0c;开启base64按钮&#xff0c;下载转换后的文件 3. 在下载解压后的文件夹中找到stylesheet.css&#xff0c;并复制其中的base64 4. 修改index.wxss文…

vue使用拖拽功能实现仓库存放货物的需求

效果&#xff1a; 代码 <template><div><div class"bigTitle">xxxxxxxxxxxxxx仓库拖拽系统</div><div class"container2 flex-j-space-between"><div class"product-list"><div class"leftTree h…

Clickhouse 优势与部署

一、clickhouse简介 1.1clickhouse介绍 ClickHouse的背后研发团队是俄罗斯的Yandex公司&#xff0c;2011年在纳斯达克上市&#xff0c;它的核心产品是搜索引擎。我们知道&#xff0c;做搜索引擎的公司营收非常依赖流量和在线广告&#xff0c;所以做搜索引擎的公司一般会并行推…

网关gateway的简介和搭建过程

目录 1.什么是网关和网关的应用情景 2.网关是如何演化来的&#xff0c;在微服务中有什么作用&#xff1f; 3.网关的基本功能 4.Spring Cloud gateway的发展史 5.和网关类似的功能组件&#xff1a; 6.为什么微服务当中一定要有网关 7.微服务网关的优点 8.gateway的搭建过程…

InterProcessMutex 类的作用和使用

InterProcessMutex 类是Curator框架中的一个分布式锁的实现&#xff0c;用于在分布式环境下实现互斥锁。 InterProcessMutex 的使用步骤如下&#xff1a; 创建 CuratorFramework 客户端实例&#xff0c;并启动客户端连接到 ZooKeeper 服务器。使用 CuratorFramework 的 creat…