引言
随着Java语言的不断演进,我们迎来了JDK 11的时代。JDK 11作为Java平台的一个重要版本,不仅引入了许多令人振奋的新特性,还对性能、安全性和模块化系统进行了关键的改进。在这篇文章中,我们将深入探讨从JDK 8升级到JDK 11的过程,揭示升级的重要性以及带来的诸多益处。
从模块系统到HTTP客户端,再到局部变量类型推断,JDK 11为Java开发者带来了一系列令人期待的新特性。这些特性不仅使得代码更加简洁、易读,还提供了更好的性能和安全性。
在追求更高性能、更安全应用的时代,升级到JDK 11是一项不可忽视的任务。本文将深入探讨升级过程中的关键步骤、新特性的应用,以及升级所带来的重要益处,助力开发者更好地利用Java技术栈。
为何要升级jdk11
升级 JDK 8 到 JDK 11 具有许多好处,这些方面涵盖了新特性、性能优化、安全性增强以及生态系统的健康。
新特性和改进:JDK 11引入了许多新特性和改进,包括模块系统(Module System)、HTTP 客户端、局部变量类型推断(var 关键字)等。这些新特性可以帮助开发人员编写更现代、高效和可维护的代码。
性能优化:JDK 11 针对性能进行了多项优化,包括新的垃圾回收器、运行时性能改进等。这可以帮助提高应用程序的性能,减少资源消耗,使其更具竞争力。
模块化系统:引入的模块系统使得项目更容易维护和管理。它允许开发者将代码模块化,提高了代码的可重用性和可维护性,同时还可以更好地控制项目的依赖关系。
移除过时的 API:JDK 11 移除了一些在 JDK 8 中被标记为过时的 API,使得开发者能够使用更现代的替代方案,并且在代码中更容易维护。
生态系统的发展:随着时间的推移,更多的第三方库和框架将升级到支持 JDK 11,使得开发者能够充分利用新的功能和性能优势。
技术债务的管理:随着时间的推移,维护老旧的 JDK 版本可能会导致技术债务的积累。升级到新的 JDK 版本可以帮助企业和项目管理技术债务,确保系统的可维护性和持续演进。
升级前的准备
升级前应该检查项目的依赖关系,在项目中寻找到可能出现依赖版本老旧,依赖冲突,依赖不支持JDK11版本等问题。
在平台层面应该测试JDK11是否可运行,且JDK11的小版本要适合当前项目的规划 ,测试与生产服务器是否可以兼容JDK11部署问题,从而预知可能出现的问题。
升级过程
- • 首先在环境上安装对应的JDK版本,通过测试类测试JDK11是否可运行
- • 使用代码检查工具检测要升级的项目版本是否存在代码层面的错误(例如 :jdeps等)
- • 检查项目依赖部分内容,在jdk11中抛弃了很多jdk8的内容(例如:javax依赖、@Resource注解等内容)
- • 检查依赖部分是否有冲突
解决方案
在升级过程中,遇到的大部分问题主要为依赖问题,其中有依赖缺失、dubbo启动问题、打包问题、Spring启动问题等
本方案为jdk8升级到jdk11.0.2
以下是我遇到的问题以及解决方案
项目启动dubbo引用失败
jdl8升级jdk11 Dubbo所依赖的Spring所使用的javassist是一个老版本所以引入此依赖
代码语言:javascript复制<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>
不支持@Resource注解的问题
代码语言:javascript复制<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
JDK11打包报错需增加依赖(注中含有尖括号)
在java项目中打包时会引入maven-javadoc-plugin插件将java注解打包到一个jar包中,但是如果java的注解不够标准的话则会抛出异常,无法正常的打包。解决方案是添加如下配置。
代码语言:javascript复制<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.4</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<additionalparam>-Xdoclint:none</additionalparam>
<source>8</source>
<encoding>UTF-8</encoding>
</configuration>
</execution>
</executions>
</plugin>
不支持@WebEndpoint
代码语言:javascript复制<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.3</version>
</dependency>
启动时一直等待Dubbo
[Dubbo] Current Spring Boot Application is await...
代码语言:javascript复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.1</version>
</dependency>
javax.jws.WebService不存在
代码语言:javascript复制<dependency>
<groupId>javax.jws</groupId>
<artifactId>javax.jws-api</artifactId>
<version>1.1</version>
</dependency>
javax.xml.bind. annotation.不存在
代码语言:javascript复制<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
以上就是我在升级jdk11过程中遇到的问题以及解决方案!
测试和调试
- • 测试包括以下建议
单元测试:运行项目中的所有单元测试,确保它们在JDK11下仍然通过。
集成测试和端到端测试:把项目完全构建起来进行测试,包括前端,缓存库,数据库,进行全面的测试。
执行性能测试:运行性能测试以确保在JDK11 下的性能表现是可接受的。
使用监控工具(如VisualVM、JConsole等)检查应用程序的内存和 CPU 使用情况。
- • 通过这些测试确保jdk11升级后不会有太大的问题。
参考文献
https://mvnrepository.com/
喜欢文章就关注一下吧