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

news2024/11/16 21:56:44

前言

工作中,难免会遇到升级版本的事情。这次由于两个系统中,系统 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.coloradmin.cn/o/832006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

状态模式——对象状态及其转换

1、简介 1.1、概述 在软件系统中&#xff0c;有些对象也像水一样具有多种状态&#xff0c;这些状态在某些情况下能够相互转换&#xff0c;而且对象在不同的状态下也将具有不同的行为。为了更好地对这些具有多种状态的对象进行设计&#xff0c;可以使用一种被称为状态模式的设…

SAS-数据集SQL水平合并

一、SQL水平合并基本语法 sql的合并有两步&#xff0c;step1&#xff1a;进行笛卡尔乘积运算&#xff0c;第一个表的每一行合并第二个表的每一行&#xff0c;即表a有3行&#xff0c;表b有3行&#xff0c;则合并后3*39行。笛卡尔过程包含源数据的所有列&#xff0c;相同列名会合…

JavaScript的单元挑战

Steven想要建立一个非常简单的小费计算器&#xff0c;以便他去餐厅吃饭时使用。在他的国家&#xff0c;如果账单金额在50到300之间&#xff0c;通常会给15%的小费。如果金额不同&#xff0c;小费就是20%。 您的任务是根据账单金额计算小费。为此创建一个名为’tip’的变量。不允…

2023天猫休闲零食市场分析(天猫数据分析软件)

基于较大的人口基数以及人们对休闲零食的需求&#xff0c;我国的休闲零食市场始终保持着稳健的增长趋势&#xff0c;行业整体的规模也比较大。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;2023年1月份至4月份&#xff0c;天猫平台上休闲零食行业的销量为6亿&#xff…

对模版以及模版中参数的理解

所谓模板&#xff0c;实际上是建立一个通用函数或类&#xff0c;其类内部的类型和函数的形参类型不具体指定&#xff0c;用一个虚拟的类型来代表。 就比方说你想要实现 一个Add的加法函数&#xff0c;面对不同的类型&#xff0c;你是否要进行多次函数重载呢&#xff0c;其实这多…

网络安全(黑客)自学的误区

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…

许战海咨询方法论系列白皮书在京隆重发布

新时代&#xff0c;面对剧烈变化的竞争环境&#xff0c;企业如何实现结构性增长&#xff1f; 7月31日&#xff0c;许战海咨询最新研究成果——《主品牌进化战略》、《第二招牌增长战略》、《链主品牌&#xff1a;制造业的竞争之王》三本核心方法论白皮书&#xff0c;重磅发布。…

移动端网页div下滑消失、上滑出现(附带闪烁效果)

<div :class "IconShow ? mhomeIcon : IconOff"><img src"/assets/news.svg" alt""></div>// 距离顶部的距离const top ref(0) // 图标向上还是向下滑动const IconShow ref(true)// 滑动监听&#xff0c; 注意如果只有doc…

【C++】深入浅出STL之vector类

文章篇幅较长&#xff0c;越3万余字&#xff0c;建议电脑端访问 文章目录 一、前言二、vector的介绍及使用1、vector的介绍2、常用接口细述1&#xff09;vector类对象的默认成员函数① 构造函数② 拷贝构造③ 赋值重载 2&#xff09;vector类对象的访问及遍历操作① operator[]…

zookeeper入门学习

zookeeper入门学习 zookeeper应用场景 分布式协调组件 客户端第一次请求发给服务器2&#xff0c;将flag值修改为false&#xff0c;第二次请求被负载均衡到服务器1&#xff0c;访问到的flag也会是false 一旦有节点发生改变&#xff0c;就会通知所有监听方改变自己的值&#…

c++画出分割图像,水平线和垂直线

1、pca 找到图像某个区域的垂直线&#xff0c;并画出来 // 1、 斑块的框 血管二值化图&#xff0c;pca 找到垂直血管壁的直线, 还是根据斑块找主轴方向吧// Step 1: 提取斑块左右范围内的血管像素点坐标&#xff0c;std::vector<cv::Point> points;for (int y 0; y <…

Stable Diffusion教程(6) - 扩展安装

打开stable diffusion webUI界面 加载插件列表 依次点击扩展->可用->加载自 搜索插件 首先在搜索框输入你要安装的插件&#xff0c;然后点击插件后面的安装按钮 如果你需要的插件这里面没有找到&#xff0c;可通过通网址安装的方式安装。 在git仓库网址输入框输入的你插件…

警惕!中科院预警,Frontiers这本不被收录!2023年7月EI目录已更新!(附全年下载)

2023年7月EI期刊目录更新 爱思唯尔官网近日更新了EI期刊目录&#xff0c;此次更新是2023年7月1日&#xff0c;与上次更新&#xff08;2023年6月&#xff09;相比&#xff0c;有1本期刊名称在Serials&#xff08;连续出版&#xff09;列表中搜索不到&#xff0c;详情如下&#…

InfiniBand、UCIe相关思考

InfiniBand、UCIe相关思考 内容1、InfiniBandInfiniBand是什么&#xff1f;InfiniBand的来历是什么&#xff1f;InfiniBand为什么重要&#xff1f;InfiniBand相较于Ethernet区别&#xff1f;同领域内还有其他哪些技术&#xff1f;InfiniBand中RDMA是种什么技术&#xff1f; 内容…

【Linux】计算机网络的背景和协议分层

文章目录 网络发展协议何为协议网络协议协议分层OSI七层模型TCP/IP五层模型&#xff08;四层&#xff09; 基本通信流程mac地址和ip地址网络通信本质 网络发展 从一开始计算机作为一台台单机使用&#xff0c;到现在网络飞速发展&#xff0c;从局域网Lan建立起局域网&#xff0…

【零基础学Rust | 基础系列 | Cargo工具】Cargo介绍及使用

文章目录 前言一&#xff0c;Cargo介绍1&#xff0c;Cargo安装2&#xff0c;创建Rust项目2&#xff0c;编译项目&#xff1a;3&#xff0c;运行项目&#xff1a;4&#xff0c;测试项目&#xff1a;5&#xff0c;更新项目的依赖&#xff1a;6&#xff0c;生成项目的文档&#xf…

什么运动耳机好用?市面上公认表现最好的几款耳机

随着技术的发展&#xff0c;运动蓝牙耳机这个类别已经进化到了骨传导的形式&#xff0c;也受到了广大运动爱好者的一致好评。作为爱运动的玩家&#xff0c;我一直在找可以兼顾运动和音质的骨传导&#xff0c;最近体验到了几款表现还不错的无线骨传导耳机&#xff0c;跟大家分享…

JAVASE---继承和多态

继承 比如&#xff0c;狗和猫&#xff0c;它们都是一个动物&#xff0c;有共同的特征&#xff0c;我们就可以把这种特征抽取出来。 像这样把相同的可以重新放到一个类里面&#xff0c;进行调用&#xff0c;这就是继承。 概念 继承(inheritance)机制&#xff1a;是面向对象程…

Java记录一次生产CPU飙升查找原因

java项目:项目定制化产品的微服务,主要做查es的定时任务和报表统计,实时监控数据. 上线几天,cpu报警 看图: 排查思路: 七八个定时任务同时查es,可能造成的飙升,然后只能拿jstack分析,生产环境慎用. jstack是Java开发工具包中的一个命令行工具&#xff0c;用于生成Java虚拟机&…

软件测试环境讲解

在一个项目开发到发布的整个过程中&#xff0c;会使用到很多个环境进行测试和运行项目。最基本的开发环境、测试环境、准生产环境、生成环境 一、开发环境 开发环境顾名思义就是我们程序猿自己把项目放到自己的电脑上&#xff0c;配置好以后&#xff0c;跑起来项目&#xff0c…