- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
鉴于JDK8已经是老古董,还有性能问题,兼且各个公司已经不再维护1.8的JDK,所以升级公司的核心产品之一的后端到JDK到17是相对要紧的事情.
通过升级到jdk17,具有以下好处:
本次升级后端,大概耗费了一周的时间,其次httpsecurity耗费了比较多的时间.
整体上,还算顺利.
。
。
总体上遵循以下步骤:
(1) 升级准备 。
(2) 确定spring组件版本 。
到spring.io上看了下,选择springboot-3.3.0 。
(3) 确定其它组件版本 。
(4) 升级有关代码 。
(5) 调整其它配置 。
(6) 解决有关异常 。
(7) 测试 。
(8) 完成升级 。
由于这是一个大的版本升级,所以需要做以下准备:
(1) 确认是否能升级 。
除了前文提到的原因,还需要确定当前这个产品是否可以升级,毕竟JDK17和JDK1.8不一样,且升级了JDK17后,有关的组件都要一起升级(是否有相关的版本,相关版本是否稳定?) 。
考虑到我们的产品没有使用太多的三方软件,即使有,也都是流行的 。
现在jdk17都已经发布了快3年了;有很多其它公司也升级到了jdk17;部分公司已经把他们的产品升级到JDK21了.
结合这些因素,产品升级到jdk17不存在技术障碍! 。
之所以没有考虑立刻升级到JDK21,是因为其它很多产品都在JDK17,其次一次性到21,没有那么大把握。步子太大,会不会扯蛋了?
虽然官方的文档说springboot3.3.x支持JDK22。但是由于三方组件的存在,导致不敢一次性迈出太大的步子.
(2) 在git/svn上开一个分支,或者直接开一个新的仓库,不要影响现有的主干代码 。
在spring.io上可以看到可用的版本,本着使用最新可用版本的原则,选择了
按照spring惯例,当升级的时候,通常相关的组件都是一期升级的,所以总的来说,只要指定springboot版本即可.
。
。
分类 。 |
组件 。 |
功能描述 。 |
旧版本 。 |
升级 。 |
新版本 。 |
说明 。 |
数据存取 。 |
druid-spring-boot-starter 。 |
数据连接和连接池管理 。 |
1.2.11 。 |
是 。 |
1.2.23 。 |
核心组件,必须升级 。 |
jdbc驱动 。 |
* 。 |
jdbc连接 。 |
。 |
否 。 |
。 |
主要看各个厂家,考虑到jdbc驱动都是比较成熟的,在jdk17中运行,问题应该也不大 。 |
消息队列 。 |
org.apache.rocketmq/rocketmq-client 。 |
amqp 。 |
5.1.0 。 |
否 。 |
。 |
暂时不升级,这个需要较长时间的测试 。 |
http请求 。 |
httpclient,httpcore 。 |
rest请求 。 |
4.5.13 。 |
是 。 |
5.3.1/5.2.4 。 |
原来是: org.apache.httpcomponents/httpclient 。 现在是: org.apache.httpcomponents.client5/httpclient5 。 |
http 。 |
javax.servlet/javax.servlet-api 。 |
servlet 。 |
4.0.1 。 |
否 。 |
。 |
移除 。 |
http 。 |
jakarta.servlet/jakarta.servlet-api 。 |
servlet 。 |
6.0.0 。 |
否 。 |
。 |
新增。用于替代javax.servlet-api 。 |
JSON 。 |
fastjson2 。 |
JSON 。 |
2.0.32 。 |
是 。 |
2.0.51 。 |
fastjson2bug较多,尽可能升级下 。 |
JSON 。 |
com.jayway.jsonpath/json-path 。 |
JSON路径分析 。 |
2.8.0 。 |
否 。 |
。 |
。 |
ORM 。 |
mybatis-spring-boot-starter 。 |
orm 。 |
2.2.2 。 |
是 。 |
3.0.3 。 |
不升级会导致mybatis有关bean初始化异常 。 |
ORM 。 |
pagehelper-spring-boot-starter 。 |
分页 。 |
1.4.3 。 |
是 。 |
2.1.0 。 |
被mybatis依赖 。 |
ORM 。 |
jsqlparser 。 |
sql解析 。 |
4.2 。 |
是 。 |
4.7 。 |
被pageHelper依赖 。 |
XML 。 |
javax.xml.bind/jaxb-api 。 |
XML解析 。 |
2.3.1 。 |
否 。 |
。 |
暂时不可替代,不可删除,也不需要升级 。 |
文档 。 |
swagger 。 |
文档 。 |
。 |
否 。 |
。 |
从现有版本移除 。 |
定时/调度 。 |
quartz 。 |
定时/调度 。 |
2.3.2 。 |
否 。 |
。 |
。 |
通用工具 。 |
org.apache.commons/common-lang3 。 |
。 |
3.12.0 。 |
是 。 |
3.14.0 。 |
。 |
通用工具 。 |
org.apache.commons/commons-pool2 。 |
。 |
2.9.0 。 |
是 。 |
2.12.0 。 |
。 |
通用工具 。 |
commons-io/commons-io 。 |
。 |
2.11.0 。 |
否 。 |
。 |
。 |
通用工具 。 |
commons-fileupload/commons-fileupload 。 |
。 |
1.4 。 |
否 。 |
。 |
。 |
存储 。 |
minio 。 |
。 |
8.2.1 。 |
否 。 |
。 |
。 |
编译 。 |
maven-compiler-plugin 。 |
编译 。 |
3.1 。 |
是 。 |
3.13.0 。 |
。 |
注
当更换了以下组件之后,需要尽快修改代码,修改的原因主要包含:
(1) 配置变更 。
主要是spring升级导致,可能需要修改配置。当然也可能是其它的组件 。
(2) 包路径变更 。
(3) 方法不存在 。
(4) 方法过时 。
这个需要特别注意-如果可能应该尽量把过时的方法移除掉,替换为正常的方法.
在spring.data的域名之下,有很多的内容,远不止redis.除了基本的JDBC,还有Rest,elasticsearch,jpd,ldap等等.
。
spring main allow-circular-references: true 。 allow-bean-definition-overriding: true 。 |
。
在spring6.1.10中,这两个属性默认是false.如果你的项目不存在循环引用,或者覆盖定义的情况,那么可以不添加. 。
移除swagger配置-这个太垃圾,过分入侵,还浪费了自有的注释,增大程序员的工作量 。
希望有直接能够利用javaDoc的类似组件.
。
基础类型主要指Integer,Long,BigDecimal,BigInteger等等.
在jdk17中,许多方法已经被标注为过时(deprecated).
(1) java基类 new Class("xxx")需要修改为 Class.valueOf("xxx") 。
new Long("xx"),new Integer("xxx"),new Byte("xx"),new Short("") 。
这些都要修改为对应的valueOf("xxx").
jdk这么做,主要是出于性能考虑,尤其针对Integer.
(2) Class.newInstance() 。
需要把这个替换为getDeclaredConstructor().newInstance() 。
(3) Spring.Base64Util过时,改用apache的Base64 。
(4) ruoyi自身的Base64,移除掉,避免和apache的冲突.
(5) ruoyi自身的md5Util移除 。
从spring自身的改变来看,spring也逐渐向java标准和阿帕奇基金会靠近,一个是为了标准,其次是避免浪费 。
时间,最后是不要给spring用户带来困扰。spring只要做好自己的就行了.
ruoyi如果用于项目还是可以的,但是用于产品开发还是需要进行较多的改造。 因为产品要求更高的安全、适应度、性能等.
由于在jdk17中移除了javax的部分包,所以很多javax.xxx都需要修改jakarta.xxx 。
这里主要包含:
(1) javax.servlet 。
(2) javax.annotation 。
其它javax.net,javax.sql等则继续保留着.
。
具体略,总之需要修改.
httpclient5有重大变更:支持http2,异步支持,更好的连接池等 。
这个改变比较大,在spring6.x主要通过注解和定义bean来实现spring-security配置,而在5.x中,则是通过扩展WebSecurityConfigurerAdapter来实现.
。
@Configuration 。 @EnableWebSecurity 。 @EnableGlobalAuthentication 。 @EnableMethodSecurity(prePostEnabled = true, securedEnabled = true) 。 public class SecurityConfig { 。 } 。 。 |
。
注意,不要去override已有的实现,否则配置还是比较麻烦的.
spring的思路就是你可以改配置,改零件,但是不要改核心。如果要改核心,那么太费劲了.
在这个类中实现以下几个bean即可:
其中SecurityFilterChain是关键,这里主要配置白名单.
另外一个变化是,禁用了默认的logout,而是新增了一个/logout接口:
。
/** 。 * 执行退出 。 * @param request 。 * @return 。 * @since 1.5 。 */ 。 @PostMapping("/logout") 。 public AjaxResult logout(HttpServletRequest request) { 。 try { 。 LoginUser user=SecurityUtils.getLoginUser(), String key=CacheConstants.LOGIN_TOKEN_KEY + user.getToken(), redisCache.deleteObject(key), return AjaxResult.success(), } 。 catch(Exception e) { 。 //如果有异常,则证明已经退出了,不要阻拦 。 return AjaxResult.success(), } 。 } 。 |
。
主要是因为pageHelper升级了.
当然产品本身也有用到jsqlparser.
主要是编译方面的配置.
由于升级了jdk,包括核心组件maven-compiler-plugin,所以有些原来的默认设置需要进行调整.
在eclipse中,其实只需要设置pom.xml中配置即可,无需修改工程的环境配置.
。
<plugin> 。 <groupId>org.apache.maven.plugins</groupId> 。 <artifactId>maven-compiler-plugin</artifactId> 。 <version>3.13.0</version> 。 <configuration> 。 <source>${java.version}</source> 。 <target>${java.version}</target> 。 <encoding>${project.build.sourceEncoding}</encoding> 。 <parameters>true</parameters> 。 </configuration> 。 </plugin> 。 |
。
红色部分添加上去,并设置为true.
如果不添加这个,那么spirng中很多需要通过反射获取信息的方法可能存在问题.
因为这个选项会让java把.java编译为.class的时候,保留方法的名称,而不是把方法名称随意修改为不认识的名称.
。
。
如前,主要新版本中,有些参数修改了默认值,所以修改如下:
spring main allow-circular-references: true 。 allow-bean-definition-overriding: true 。 |
。
当有多个Datasource类型的Bean,或者类似其它的,则必须为Bean添加@Primary的注解,否则回报告异常.
Parameter 0 of method sqlSessionFactory in com.ruoyi.framework.config.db.MyBatisConfig required a single bean, but 3 were found
触发异常的具体代码如下:
。
。
。
而在以前的版本中不存在这个! 。
解决方式有两个:
(1) 在参数上简单添加@Qualifier("masterDataSource") -- 解决了mybatis,但是还要解决quartz等等。放弃这个方法 。
(2) 直接修改定义DataSource的地方,为主bean添加@Primary ,就用这个✔ 。
。
无法处理key类型不是String类型,例如如果是以下类型的JSON 。
。
{ 。 "batchDetail": { 。 1: "good" 。 } 。 } 。 |
。
在序列化的时候会报告异常:
org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap') 。
。
必须自定义HttpMessgeConverter,以便可以自定义处理这种类型的key.
但这会导致自定义白名单功能错误,所以还需要调整白名单功能 。
。
经过定位,这是mybatis没有升级导致的.
注:一开始的时候,并没有立刻要升级mybatis,虽然意识到了,但是并没有那么做.
。
。
(1) 每个地方都需要测试 。
(2) 反复测试 。
这是总的原则.
测试需要持续较长时间,严格而言,需要再考费一个月左右.
。
从目前来看,总体是可用! 。
从性能上看,JDK17的程序的确响应更快一些,从页面的响应也可以看出来! 。
。
。
完成升级后,关闭原来git上代码的权限,设置为只读,并通知有关人.
。
最后此篇关于从JDK8升级到JDK17的文章就讲到这里了,如果你想了解更多关于从JDK8升级到JDK17的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我几乎不敢在这里问这个问题,因为它似乎应该很容易通过谷歌或 ravendb.net 获得。但是,我一直很难找到将我的 RavenDB 升级到新版本的正确方法。我目前正在运行 573 版并希望升级到 6
这周我需要升级当前版本的 DNN。我目前使用的是 2.1.1。我不想每件事都做两次,所以,我有几个问题。 是否有升级工具或某些脚本可以帮助我进行升级。 我最好安装 4.9 还是 5.0。这是生产。 如
将 Sugarcrm 从 6.2 升级到 6.3 版本时遇到问题。当我升级本地 Sugarcrm 安装时,它可以工作,但是当我开始升级我的 Sugarcrm 6.2 站点并上传升级包时,它不会上传。
有没有办法绕过 Meteor 的自动更新功能?我坚持 Downloading meteor-tool@1.3.0_3... \ 当我尝试运行现有项目,或创建一个新项目或只是运行“
我已将应用内集成到我的 Andorid 应用程序中,用于单个产品 productone。 为此,我在我的 Google Play 控制台中创建了不同的产品 ID,如下所示: 1。 productone
我在将 TeamCity 版本 2017.1.1 升级到 2017.1.2 时遇到问题。这个问题涉及 TeamCity 和 PostgreSQL 的工作。我的工作: 停止 teamcity 进程 /e
我寻找了这个问题的具体答案,但找不到——即使是在 WAMPSERVER 网站上也是如此。我确定我忽略了它。 我有 Wampserver 2.0、MySQL 5.0.51b、PHP 5.2.6 和 Ap
我使用 Ubuntu 软件中心默认的 Eclipse 3.7。 我想将 Eclipse 升级到 kepler 版本,所以我添加了 repository 我收到以下错误消息: Cannot comple
你好 我只想安装 mercurial,但对于它需要 python 2.6 的所有版本,我尝试使用 .rpm 文件,但我唯一得到的是很多充满错误的行,它告诉我:需要安装在 2.6 之前和 2.5 之后的
我完全知道 Gradle 网站上有一些页面说明了如何升级,但仅限于 4.x 及更高版本。 我正在尝试关注 tutorial制作一个简单的“我的第一个”Minecraft 模组。在其中,您被告知安装 f
我们想升级 Kerberos(服务器和客户端) 当前:1.6.3-133.27.1 目标:1.6.3-133.49.97.1 问题是如果我们用包管理器升级它,下面会发生什么? KDC 数据库 所有主要
背景 原计划 2019 年发布的 Vue3,又经过一年的再次打磨,终于于去年 9 月正式发布。随后,不少 UI 组件库都积极参与适配,去年 12 月,Element-plus(
我有一个版本为 2.3.4 的 grails 项目,我需要尽可能升级到最新版本。查看文档我意识到从 2.x 到 3.x 有巨大的变化。 问题是:从 2 到 3、从 3 到 4、从 4 到 5 逐步升级
我正在将 API 项目从 .net5 升级到 .net6 它以前工作,现在它崩溃 内部异常消息“抛出了‘Unity.Exceptions.InvalidRegistrationException’类型
我将我的项目从 expo 44 升级到 expo 45,现在我有无数这样的错误: The module 'MaterialIcons' can't be used as JSX component.
我已经升级了掌 Helm 模板(手动) 以前的片段depoloyment.yaml : apiVersion: apps/v1beta2 kind: Deployment metadata: na
我正在尝试将我的 Scala Play Framework 应用程序升级到 2.8,这涉及将 SBT 升级到 1.x。 在我的 build.propeties 我有 sbt.version=1.3.5
我想在我的 Windows 服务器上安装 PHPUnit 3.7。我遵循了各种说明 here并以 PHPUnit 3.4.1 结束。当我尝试使用以下方法再次安装它时: pear update chan
Microsoft.Net 4.5 即将推出,我想在 MS 发布最终版本时升级我的 clickonce 应用程序。 我的问题是:已经安装了 clickonce 应用程序(使用 .net 4.0)的用户
为了将 Angular 8 更新到 9,我正在按照官方文档升级。 这建议首先更新到最新版本的 angular 8,例如: ng update @angular/core@8 @angular/cli@
我是一名优秀的程序员,十分优秀!