JDK1.8升级JDK17笔记.250408
零、将JDK从1.8升级到17的显著优势:
一、安全性增强
-
漏洞修复与加密算法升级
JDK 17修复了JDK 1.8中遗留的多个安全漏洞,例如通过禁用旧版TLS/SSL协议、默认启用更安全的加密算法(如TLSv1.3)来提升网络通信安全性。此外,模块化系统(JPMS)通过强封装限制对内部API的访问,减少了反射滥用导致的安全风险(如FastJSON漏洞场景)。 -
数据安全与反序列化控制
引入特定于上下文的反序列化过滤器,防止恶意数据注入。XML处理方面,通过Apache Santuario 3.0.3增强支持SHA3算法和椭圆曲线加密。
二、语言特性与开发效率提升
-
语法简化与新特性
- 记录类(Records) :简化不可变数据类的声明,减少样板代码。
- 密封类(Sealed Classes) :限制类或接口的继承范围,增强类型安全。
- 模式匹配:优化
instanceof
检查和switch
表达式,使代码更简洁。 - 文本块(Text Blocks) :支持多行字符串声明,提高可读性。
-
API与工具增强
- 新增
HttpClient
支持HTTP/2.0和WebSocket,替代旧版HttpURLConnection
。 - 改进
Stream API
和集合工厂方法(如List.of()
),简化集合操作。 - 引入
var
局部变量推导和yield
关键字,降低编码复杂度。
- 新增
三、性能优化
-
垃圾回收器改进
- ZGC与Shenandoah GC:将STW(Stop-The-World)时间控制在10毫秒内,适合低延迟场景。
- G1优化:默认垃圾回收器,优化内存分配和回收效率。
-
编译与执行效率
- JIT编译器增强:Graal JIT编译器提升运行时性能。
- AOT编译:通过提前编译优化启动速度。
四、生态系统与框架支持
-
现代框架依赖
Spring Boot 3.0、Spring Framework 6.x等主流框架已强制要求JDK 17,支持新特性如响应式编程和模块化开发。Jakarta EE 9+也深度适配JDK 17,推动云原生开发。 -
工具链兼容性
Maven、Gradle等构建工具,以及IntelliJ IDEA、Eclipse等IDE均已全面支持JDK 17。
五、长期维护与成本优化
-
LTS支持周期
JDK 17是长期支持版本(LTS),官方维护至2029年,降低企业因频繁升级产生的成本。 -
部署与维护简化
单JDK环境部署替代多版本并存,减少环境复杂度。同时,JDK 17对JDK 8代码保持向下兼容,迁移风险可控。
六、未来技术前瞻性
-
本地交互与内存管理
外部函数和内存API(FFM)支持高效本地代码调用,为高性能计算场景铺路。 -
向量API与云原生优化
提供SIMD指令支持,加速数据并行处理,结合GraalVM可进一步提升云原生应用性能。
总结
升级至JDK 17不仅能够解决历史版本的安全隐患,还能通过新特性提升开发效率,结合性能优化和生态支持,为现代应用提供更稳定、高效的运行环境。尽管需评估兼容性风险,但其长期支持和技术前瞻性使其成为企业级项目的优选。
壹、升级笔记
1、新增依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version> <!-- 使用最新版本或与项目兼容的版本 -->
</dependency>
<jakarta-version>2.0.0</jakarta-version>
<springdoc-openapi-ui.version>1.7.0</springdoc-openapi-ui.version>
<spring-boot-starter-jdbc.version>3.3.2</spring-boot-starter-jdbc.version>
<dubbo-spring-boot-starter.version>3.2.5 </dubbo-spring-boot-starter.version>
<springdoc-openapi-starter-webmvc-ui>2.2.0</springdoc-openapi-starter-webmvc-ui>
<spring-cloud-starter-bootstrap>4.1.2</spring-cloud-starter-bootstrap>
1、版本升级依赖
<encoding>UTF-8</encoding>
<!-- JDK 版本 -->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<jdk.version>17</jdk.version>
<!-- Spring Boot 版本 -->
<spring-boot.version>3.3.2</spring-boot.version>
<!-- Spring Cloud 版本 -->
<spring-cloud.version>2023.0.3</spring-cloud.version>
<!-- Spring Cloud Alibaba 版本 -->
<spring-cloud-alibaba.version>2023.0.1.3</spring-cloud-alibaba.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jakarta-version>2.0.0</jakarta-version>
<springdoc-openapi-ui.version>2.2.0</springdoc-openapi-ui.version>
<agent.version>1.0-SNAPSHOT</agent.version>
<rocketmq.version>2.2.1</rocketmq.version>
<geodesy.version>1.1.3</geodesy.version>
<spring-boot-starter-jdbc.version>3.3.2</spring-boot-starter-jdbc.version>
<knife4j.version>3.0.3</knife4j.version>
<spring-cloud-starter-bootstrap.version>4.1.2</spring-cloud-starter-bootstrap.version>
<xxl-job-version>2.3.0</xxl-job-version>
<skywalking.version>8.12.0</skywalking.version>
<hutool.version>5.8.22</hutool.version>
<zxing.version>3.5.2</zxing.version>
<nacos-client.version>2.2.3</nacos-client.version>
<nacos.client.version>2023.0.1.3</nacos.client.version>
<fastjson.version>2.0.32</fastjson.version>
<commons-lang3.version>3.14.0</commons-lang3.version>
<mybatis-spring-boot.version>3.0.4</mybatis-spring-boot.version>
<mybatis-plus-boot.version>3.5.7</mybatis-plus-boot.version>
<jsqlparser.version>4.9</jsqlparser.version>
<pagehelper-boot.version>2.1.0</pagehelper-boot.version>
<mysql-connector>8.0.33</mysql-connector>
<druid.version>1.2.21</druid.version>
<log4j.version>2.20.0</log4j.version>
<lombok.version>1.18.30</lombok.version>
<dubbo.version>3.2.8</dubbo.version>
<sentinel-version>1.8.6</sentinel-version>
<easyexcel.version>3.3.3</easyexcel.version>
<okhttp3.version>4.12.0</okhttp3.version>
<junit.version>5.9.3</junit.version>
<hutool.version>5.8.25</hutool.version>
<mapstruct.version>1.5.5.Final</mapstruct.version>
<jwt.version>3.4.0</jwt.version>
<springdoc-openapi.version>1.7.0</springdoc-openapi.version>
<spring.version>6.1.11</spring.version>
<maven-dependency.version>2.8</maven-dependency.version>
<maven-jar.version>3.3.0</maven-jar.version>
<maven-resources.version>2.6</maven-resources.version>
<maven-surefire.version>2.12.4</maven-surefire.version>
<maven-compiler.version>3.11.0</maven-compiler.version>
修改依赖
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler.version}</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${encoding}</encoding>
<forceJavacCompilerUse>true</forceJavacCompilerUse>
<compilerArgs>
<arg>-parameters</arg>
<!-- 统一参数配置 -->
<!-- 新增模块系统参数 -->
<arg>--add-modules=jdk.unsupported</arg>
<!-- 合并重复的开放指令 -->
<arg>--add-exports=java.base/sun.nio.ch=ALL-UNNAMED</arg>
<arg>--add-exports=java.base/sun.reflect.generics=ALL-UNNAMED</arg>
<arg>--add-opens=java.base/java.lang=ALL-UNNAMED</arg>
<arg>--add-opens=java.base/java.io=ALL-UNNAMED</arg>
<arg>--add-opens=java.base/java.util=ALL-UNNAMED</arg>
<arg>--add-exports=java.base/sun.reflect.generics=ALL-UNNAMED</arg>
<arg>--add-opens=java.base/java.lang.reflect=ALL-UNNAMED</arg>
<!-- 保留一个lint参数 -->
<arg>-Xlint:all</arg>
</compilerArgs>
</configuration>
</plugin>
2、naco版本升级配套HttpMethod方法改造
// 替换前
import com.alibaba.nacos.common.utils.HttpMethod;
// 替换后
import org.springframework.http.HttpMethod;
3、springboot升级后相应注解方式改造
// 替换前
import org.springframework.boot.autoconfigure.web.ResourceProperties;
// 替换后
import org.springframework.boot.autoconfigure.web.WebProperties;
@Configuration
public class ExceptionHandlerConfiguration {
@Autowired
private WebProperties.Resources resources; // 直接注入资源配置
// 其他逻辑...
}
// 原代码
List<String> staticLocations = resourceProperties.getStaticLocations();
// 新代码
List<String> staticLocations = resources.getStaticLocations();
4、springboot升级后对应的yaml文件格式化要求改动
# 原配置
spring:
resources:
static-locations: classpath:/static/
cache:
period: 3600
# 新配置
spring:
web:
resources:
static-locations: classpath:/static/
cache:
period: 3600
5、jdk版本升级后的对应jar包路径改造
// 原代码
import javax.validation.constraints.NotNull;
// 新代码
import jakarta.validation.constraints.NotNull;
// 替换前
import javax.servlet.http.HttpServletRequest;
import javax.servlet.Filter;
// 替换后
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.Filter;
6、springboot接口文档升级后对应依赖路径导入改造
// 替换前
import io.swagger.annotations.ApiModelProperty;
// 替换后
import io.swagger.v3.oas.annotations.media.Schema;
7、springboot升级后对应的注解进行改造
所有@ApiModelProperty注解替换成 @Schema注解
8、项目升级后引入AI功能的配置
新增CatFilter.java、MonitorResponse.java、OpenApiConfig.java文件
9、springboot升级后对应的依赖包修改
import org.apache.commons.lang3.time.DateFormatUtils;
10、springboot升级后对应的测试注解升级
@ExtendWith 注解来替代 @RunWith
11、springboot升级后对应的yaml文件中redis的结构修改
redis:
address: redis://xxx.xxx.xxx.xxx:6379
#访问超时时间
data:
redis:
database: 0
host: xxx.xxx.xxx.xxx
port: 6379
password: 123456
timeout: 3000
lettuce:
pool:
# 最大活跃链接数 默认8
max-active: 5
# 最大空闲连接数 默认8
max-idle: 10
# 最小空闲连接数 默认0
min-idle: 0
```
### 12、springboot升级后对应的yaml文件中配置才能与nacos联通
```yaml
config:
#使用 optional 关键字,即便 Nacos 服务不可用,应用也能正常启动
import: optional:nacos:fhs-service-dubbo.yaml
13、springboot升级后对应redis模块升级
新增代码块
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379");
// 使用Jackson编解码器
config.setCodec(new JsonJacksonCodec());
return Redisson.create(config);
}
14、springboot升级后对应redis依赖包升级
依赖问题
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.5</version>
<exclusions>
<exclusion>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
</exclusion>
</exclusions>
</dependency>
15、springboot升级后对应的日志文件配置修改
日志配置修改
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--归档的日志文件,可与当前日志文件分开。%d{yyyy-MM-dd}指定日期格式,%i指定索引-->
<fileNamePattern>${log.path}/%d{yyyy-MM-dd}/${app_name}-ERROR-%i.log</fileNamePattern>
<!-- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<maxFileSize>100MB</maxFileSize>
<!-- </timeBasedFileNamingAndTriggeringPolicy>-->
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
16、jdk升级对应的镜像文件升级
DockerFile修改
FROM openjdk:8-jdk-alpine
# 改成
FROM openjdk:17-alpine
17、springboot升级对应的oauth2中配置信息修改
从server:
port: 8080
# security:
# oauth2:
# client:
# client-id: UserManagement
# client-secret: xxx
# access-token-uri: https://xxx.xxx.cn:8090/oauth/token
# user-authorization-uri: https://xxx.xxx.cn:8090/oauth/authorize
# resource:
# jwt:
# key-uri: https://xxx.xxx.cn:8090/oauth/token_key
修改成为
spring:
security:
oauth2:
client:
registration:
uportal:
client-id: UserManagement
client-secret: user123
authorization-grant-type: authorization_code
scope: profile, email
redirect-uri: https://xxx.xxx.cn:8090/login
provider:
uportal:
authorization-uri: https://xxx.xxx.cn:8090/oauth/authorize
token-uri: https://xxx.xxx.cn:8090/oauth/token
jwk-set-uri: https://xxx.xxx.cn:8090/oauth/token_key
18、应用修改
web
dubbo:
application:
check-serializable: false
serialize-check-status: DISABLE
#当前这个应用的信息
parameters:
fastjson2.parser.autoTypeSupport: true
jackson:
property-naming-strategy: LOWER_CAMEL_CASE # 强制小驼峰命名
visibility:
field: ANY # 确保序列化能读取私有字段
dubbo.protocol.serialization=fastjson2
redis:
address: redis://xxx.xxx.xxx.xxx:6379
#访问超时时间
data:
redis:
database: 0
host: xxx.xxx.xxx.xxx
port: 6379
password: xxxx
timeout: 3000
lettuce:
pool:
# 最大活跃链接数 默认8
max-active: 5
# 最大空闲连接数 默认8
max-idle: 10
# 最小空闲连接数 默认0
min-idle: 0
dubbo:
application:
name: basic_platform-service-dubbo
check-serializable: false
serialize-check-status: DISABLE
19、网关修改
网关异常:When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead
网关GwCorsFilter.java修改
config.setAllowCredentials(true);
config.addAllowedOriginPattern("*");
