JDK8升级JDK11经验总结

2024-01-09 15:53:22 浏览数 (2)

引言

随着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/

喜欢文章就关注一下吧

0 人点赞