JDK 8 升級 JDK 17 全流程教學指南

JDK 8 升級 JDK 17

首先已有項目升級是會經歷一個較長的調試和自測過程來保證允許和兼容沒有問題。先說幾個重要的點

  1. 遇到問題別放棄
  2. 仔細閱讀報錯,精確到每個單詞每一行,不是自己項目的代碼也要點進去看看源碼到底是為啥報錯
  3. 明確你項目引入的包,升級到 JDK17 后對應低版本的都需要升級

可能大部分同學都不是完全了解自己的項目都依賴了什么包,這個升級工作一定會加深你對 maven 包管理的理解,以及你對你項目依賴的熟悉程度和你解決排查問題的能力。

項目跑不起來就慢慢調試,問題暫時解決不了就放一放,放松一下,交給下個階段頭腦清醒的自己。

升級你的 maven 編譯版本

修改你主工程的 pom 文件

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.7.0</version><configuration><source>17</source><target>17</target></configuration>
</plugin>

我用的是 idea 修改你項目的編譯環境

在這里插入圖片描述

從新拉 maven 之后你就可以看看哪里報紅哪里需要改了,別擔心,噩夢才剛剛開始哈哈哈

去除重復依賴

長時間的維護,可能存在一個包在一個 pom 里引入兩次的情況 (真服了)

首先項目中 pom 文件不可以出現重復依賴,需要排查去掉

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>
</dependency>

對于依賴版本,不可以直接出現 RELEASE,你可以定義一個 properties 然后引用一下

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>RELEASE</version><scope>test</scope>
</dependency>

一些依賴的版本升級

這部分只列舉我再升級過程中遇到的需要升級的問題

升級 lombok 到 1.18.26

lombok 得用新版本 我之前是 1.18.4 現在換到 26

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version>
</dependency>

升級 springboot 到 2.7.14

你可以在官方文檔看到 2.7.14 對應的一些依賴版本

https://docs.spring.io/spring-boot/docs/2.7.14/reference/html/dependency-versions.html#appendix.dependency-versions

<spring.boot.version>2.7.14</spring.boot.version>
<spring.version>5.3.29</spring.version>
<dubbo.version>2.7.23</dubbo.version>

說一下我這里為什么沒有選擇擁抱 3.x ,因為 dubbo 3 才支持 springboot 3.x 和 spring6.x,而我調用的三方接口都是 dubbo2,dubbo3 應用基本注冊不向下兼容 dubbo2,會有諸多問題,所以這里選擇

2.7.14 GA 這個官網穩定支持的版本,如果你沒有這個問題,可以選擇擁抱 3.0

提醒一下如果要升級 springboot3

springboot3 棄用了 javax.servlet.http.HttpServletRequest; 需要替換為 jakarta.servlet.http.HttpServletRequest;

HandlerInterceptorAdapter 被刪除了,由 HandlerInterceptor 來代替

yml 配置允許循環依賴

spring:main:allow-circular-references: true

三方包依賴找不到類

我引入的三方包,Spring bean 加載存在問題,感覺是 JDK 升級的問題,跟 spring 的升級沒關系

是找不到這個玩意的定義 org.apache.commons.configuration.interpol.ConfigurationInterpolator

nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.commons.configuration.interpol.ConfigurationInterpolator

很怪,明明有就找不到,這里將三方包的引入排除掉,自己項目中單獨進行引入

<exclusion><artifactId>commons-configuration</artifactId><groupId>commons-configuration</groupId>
</exclusion><dependency><groupId>commons-configuration</groupId><artifactId>commons-configuration</artifactId><version>1.10</version>
</dependency>

順便提一個 springbean 加載的問題,如果你引入的三方包有路徑下的 bean 需要你進行注冊管理,你項目啟動類的掃描路徑下需要包含他的路徑,比如

@SpringBootApplication(scanBasePackages = {"com.你的包","com.三方的需要掃描的包路徑"})

當然,如果路徑一致,就一個就可以

zookeeper 升級 3.5.10

升級 zookeeper 版本為 3.5.10 , 3.5.x 以下不兼容 JDK17

https://curator.apache.org/zk-compatibility-34.html 還有個 curator 強依賴的場景需要注意升級

如果你服務器的 zookeeper 可以升級最好不過,如果不能

curator 2.x 可以兼容 zookeeper 3.5.x 的版本

如果你之前使用的是 curator 2.x 就只升級 zookeeper 的版本就行了,這樣連接你線上的 zookeeper 不會有問題。

否則請將服務器版本同步升級

可參考文章:

官方文章 https://curator.apache.org/zk-compatibility-34.html

csdn 文章 https://blog.csdn.net/wo541075754/article/details/69138878

<apache-curator.version>2.12.0</apache-curator.version>
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${apache-curator.version}</version><exclusions><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${apache-curator.version}</version><exclusions><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions>
</dependency>

mysql 版本升級 8.0.33

沒啥好說的,不升你連不上

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>

啟動項

注意你項目啟動時需要增加啟動參數,不管是實際運行還是本地調試運行

--add-opens
java.base/java.lang=ALL-UNNAMED
--add-opens
java.base/java.io=ALL-UNNAMED
--add-opens
java.base/java.math=ALL-UNNAMED
--add-opens
java.base/java.net=ALL-UNNAMED
--add-opens
java.base/java.nio=ALL-UNNAMED
--add-opens
java.base/java.security=ALL-UNNAMED
--add-opens
java.base/java.text=ALL-UNNAMED
--add-opens
java.base/java.time=ALL-UNNAMED
--add-opens
java.base/java.util=ALL-UNNAMED
--add-opens
java.base/JDK.internal.access=ALL-UNNAMED
--add-opens
java.base/JDK.internal.misc=ALL-UNNAMED

當然你如果不加也能起可以不加。解釋一下

--add-opens 參數是在 JDK 9 及更高版本中引入的,用于在模塊系統中打開特定的包以實現反射訪問。模塊系統引入了更嚴格的訪問控制,以確保代碼的可靠性和安全性。在某些情況下,一些庫或框架可能依賴于 JDK 內部的類和方法,這些類和方法在模塊系統中是受限的,因此需要通過 --add-opens 參數進行顯式打開。

具體來說,--add-opens 參數允許你在指定的模塊中打開某個包,以便其他模塊可以通過反射訪問該包中的類和方法。java.base 是 JDK 的基礎模塊,其中包含了 Java 核心類庫。使用 --add-opens java.base/java.lang=ALL-UNNAMED 參數是為了在 JDK 9 及更高版本中允許在 java.base 模塊中的 java.lang 包中打開所有未命名的類,從而允許反射訪問。

通常情況下,如果你的應用代碼遵循良好的編程實踐,是不需要使用 --add-opens 參數的。然而,一些第三方庫、框架或老舊的代碼可能會依賴于 JDK 內部的特性,這時可能會需要使用這個參數來解決訪問限制問題。不過,盡量避免在生產環境中過度依賴這種方式,因為這可能會引入一些潛在的風險和不穩定性。

比如

import sun.misc.Unsafe;public class RestrictedAccessExample {public static void main(String[] args) {try {// 使用反射獲取 Unsafe 類的實例Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");Unsafe unsafe = (Unsafe) unsafeClass.getDeclaredField("theUnsafe").get(null);// 使用 Unsafe 實例調用內部方法long value = 42;long address = unsafe.allocateMemory(8);unsafe.putLong(address, value);System.out.println("Value at address: " + unsafe.getLong(address));} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}}
}

全部啟動項示例

當然你之前的垃圾回收器可能還在用 CMS ,那已經廢棄了,所以需要改,用 G1 或者 ZGC 吧,這里我推薦直接用 ZGC。

ZGC 在 17 中已經非常成熟

-Xms2G -Xmx2G -XX:MaxDirectMemorySize=256M -XX:ThreadStackSize=512 -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M -XX:-OmitStackTraceInFastThrow -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -XX:ZAllocationSpikeTolerance=5 -Xlog:gc:/logs/gc.log 
--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.base/java.time=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/jdk.internal.access=ALL-UNNAMED --add-opens java.base/jdk.internal.misc=ALL-UNNAMED  -jar dyinggq.jar

詳細參數配置根據自己服務自行適配調整。

報錯集

這里收錄一下報錯和解決方案

nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.commons.configuration.interpol.ConfigurationInterpolator

這個找不到類,找到對應的調用位置,看看為啥沒有。最后解決方案是排除了三方包的引入,自行單獨引入該包

<exclusion><artifactId>commons-configuration</artifactId><groupId>commons-configuration</groupId>
</exclusion><dependency><groupId>commons-configuration</groupId><artifactId>commons-configuration</artifactId><version>1.10</version>
</dependency>

這個報錯是你 zookeeper 的客戶端包版本不兼容你服務器的版本

Caused by: java.lang.IllegalStateException: KeeperErrorCode = Unimplemented for org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.createEphemeral(CuratorZookeeperClient.java:114)at org.apache.dubbo.remoting.zookeeper.AbstractZookeeperClient.create(AbstractZookeeperClient.java:83)at org.apache.dubbo.registry.zookeeper.ZookeeperRegistry.doRegister(ZookeeperRegistry.java:125)... 77 common frames omitted

這里是因為我當時升級 zookeeper 的時候 curator 也一起升到 3.x 了,而線上服務 zookeeper 的版本是 3.4.x

<apache-curator.version>2.12.0</apache-curator.version>

所以 curator 還用老版本

dubbo No such extension cid for loadbalance/org.apache.dubbo.rpc.cluster.LoadBalanced

dubbo 找不到自定義的 Balance ,這個有很多情況,我說我的情況,我的情況是項目服務還在使用

com.alibaba.dubbo ,然后我想一起升級到 org.apache.dubbo ,結果找不到了,想來是路徑的問題,老的都是繼承的

com.alibaba.dubbo .rpc.cluster.LoadBalanced 你升級了需要org.apache.dubbo.rpc.cluster.LoadBalanced

這個如果你依賴三方包的,還真改不了,好在,之前版本的 dubbo 也能在 jdk17 下運行。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut aspect

這個是 aspectj 版本不匹配

排除其他包引入的 aspecj 引入對應 springboot 版本的 aspecj ,我這里給的是 springboot 2.7.14 對應的

<aspectjweaver.version>1.9.7</aspectjweaver.version>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectjweaver.version}</version>
</dependency>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43087.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43087.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第三屆“贛政杯”網絡安全大賽 | 賽寧筑牢安全應急防線

??為持續強化江西省黨政機關網絡安全風險防范意識&#xff0c;提高信息化崗位從業人員基礎技能&#xff0c;提升應對網絡安全風險處置能力。由江西省委網信辦、江西省發展改革委主辦&#xff0c;江西省大數據中心、國家計算機網絡與信息安全管理中心江西分中心承辦&#xff0…

Qt掃盲-QTableView理論總結

QTableView理論總結 一、概述二、導航三、視覺外觀四、坐標系統五、示例代碼1. 性別代理2. 學生信息模型3. 對應視圖 一、概述 QTableView實現了一個tableview 來顯示model 中的元素。這個類用于提供之前由QTable類提供的標準表&#xff0c;但這個是使用Qt的model/view架構提供…

MySQL 存儲過程

create procedure 存儲過程名 &#xff08;in | out | INPUT 參數名 參數類型&#xff0c;。。。&#xff09; 【characteristics 。。。】begin存儲過程體end存儲過程的參數類型 IN 、OUT、INPUT 都可以在一個存儲過程帶多個 沒有參數&#xff08;無參數無返回&#xff09;僅…

ProGuard + SpringBoot3 + JDK17

1、pom依賴 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…

android平臺的語音聊天助手源碼

目錄 1 android平臺的語音聊天助手源碼 1.1 Setting 1.1.1 onChildClick 1.1.2 if (groupPosition == 0) {// 語音識別設置 android平臺的語音聊天助手源碼 Setting onChildClick

神經網絡基礎-神經網絡補充概念-11-向量化邏輯回歸

概念 通過使用 NumPy 數組來進行矩陣運算&#xff0c;將循環操作向量化。 向量化的好處在于它可以同時處理多個樣本&#xff0c;從而加速計算過程。在實際應用中&#xff0c;尤其是處理大規模數據集時&#xff0c;向量化可以顯著提高代碼的效率。 代碼實現-以邏輯回歸為例 i…

邊緣網絡的作用及管理工具

自從引入軟件即服務 &#xff08;SaaS&#xff09; 以來&#xff0c;它一直引領著全球按需軟件部署創新的競賽&#xff0c;它提供的靈活性以及其云計算架構帶來的易于集成使其成為交付業務應用程序的標準。 在 SaaS 模型中&#xff0c;最佳用戶體驗的三重奏涉及無縫設置、低延…

JMeter 特殊組件-邏輯控制器與BeanShell PreProcessor 使用示例

文章目錄 前言JMeter 特殊組件-邏輯控制器與BeanShell PreProcessor 使用示例1. 邏輯控制器使用1.1. While Controller 使用示例1.2. 如果&#xff08;If&#xff09;控制器 使用示例 2. BeanShell PreProcessor 使用示例 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊…

Java課題筆記~ SpringBoot簡介

1. 入門案例 問題導入 SpringMVC的HelloWord程序大家還記得嗎&#xff1f; SpringBoot是由Pivotal團隊提供的全新框架&#xff0c;其設計目的是用來簡化Spring應用的初始搭建以及開發過程 原生開發SpringMVC程序過程 1.1 入門案例開發步驟 ①&#xff1a;創建新模塊&#…

設計模式-過濾器模式(使用案例)

過濾器模式&#xff08;Filter Pattern&#xff09;或標準模式&#xff08;Criteria Pattern&#xff09;是一種設計模式&#xff0c;這種模式允許開發人員使用不同的標準來過濾一組對象&#xff0c;通過邏輯運算以解耦的方式把它們連接起來。這種類型的設計模式屬于結構型模式…

服務器安裝centos7踩坑

1、制作啟動工具 下載iso https://developer.aliyun.com/mirror/?spma2c6h.25603864.0.0.20387abbo2RFbn http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.1995f5ad4AhJaW下載 UltraISO https://cn.ultraiso.net/插入u盤啟動 到了如圖所示頁面…

nginx php-fpm安裝配置

nginx php-fpm安裝配置 nginx本身不能處理PHP&#xff0c;它只是個web服務器&#xff0c;當接收到請求后&#xff0c;如果是php請求&#xff0c;則發給php解釋器處理&#xff0c;并把結果返回給客戶端。 nginx一般是把請求發fastcgi管理進程處理&#xff0c;fascgi管理進程選…

架構演進及常用架構

1架構演進及常用架構 1.1單體分層架構 1.2 多應用微服務架構 1.3 分布式集群部署 部署 CDN 節點&#xff1a; 用戶訪問量的增加意味著用戶地域的分散請求&#xff0c;如果所有請求都直接發送中心服務器的話&#xff0c;距離越遠&#xff0c;響應速度越差&#xff0c;這時就需…

【編織時空四:探究順序表與鏈表的數據之旅】

本章重點 鏈表的分類 帶頭雙向循環鏈表接口實現 順序表和鏈表的區別 緩存利用率參考存儲體系結構 以及 局部原理性。 一、鏈表的分類 實際中鏈表的結構非常多樣&#xff0c;以下情況組合起來就有8種鏈表結構&#xff1a; 1. 單向或者雙向 2. 帶頭或者不帶頭 3. 循環或者非…

yolov5封裝進ros系統

一&#xff0c;要具備ROS環境 ROS環境搭建可以參考我之前的文章 ROS參考文章1 ROS參考文章2 ? 建立ROS工作空間 ROS系統由自己的編譯空間規則。 cd 你自己想要的文件夾&#xff08;我一般是home目錄&#xff09; mkdir -p (你自己的文件夾名字&#xff0c;比如我是yolov5…

C++的stack和queue+優先隊列

文章目錄 什么是容器適配器底層邏輯為什么選擇deque作為stack和queue的底層默認容器優先隊列優先隊列的模擬實現stack和queue的模擬實現 什么是容器適配器 適配器是一種設計模式(設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總 結)&#xff0c;…

Greenplum多級分區表添加分區報錯ERROR: no partitions specified at depth 2

一般來說&#xff0c;我們二級分區表都會使用模版&#xff0c;如果沒有使用模版特性&#xff0c;那么就會報ERROR: no partitions specified at depth 2類似的錯誤。因為沒有模版&#xff0c;必須要顯式指定分區。 當然我們在建表的時候&#xff0c;如果沒有指定&#xff0c;那…

PyTorch訓練深度卷積生成對抗網絡DCGAN

文章目錄 DCGAN介紹代碼結果參考 DCGAN介紹 將CNN和GAN結合起來&#xff0c;把監督學習和無監督學習結合起來。具體解釋可以參見 深度卷積對抗生成網絡(DCGAN) DCGAN的生成器結構&#xff1a; 圖片來源&#xff1a;https://arxiv.org/abs/1511.06434 代碼 model.py impor…

VSCode 使用總結

快捷鍵 在 Visual Studio Code (VSCode) 中&#xff0c;有許多常用的快捷鍵可以提高編程效率。以下是一些常見的 VSCode 編程項目快捷鍵&#xff1a; 編輯器操作&#xff1a; 撤銷&#xff1a;Ctrl Z重做&#xff1a;Ctrl Shift Z復制&#xff1a;Ctrl C剪切&#xff1a;C…

Electron入門,項目啟動。

electron 簡單介紹&#xff1a; 實現&#xff1a;HTML/CSS/JS桌面程序&#xff0c;搭建跨平臺桌面應用。 electron 官方文檔&#xff1a; [https://electronjs.org/docs] 本文是基于以下2篇文章且自行實踐過的&#xff0c;可行性真實有效。 文章1&#xff1a; https://www.cnbl…