java 8 - java 17 升级指北
2022/1/11 14:05:24
本文主要是介绍java 8 - java 17 升级指北,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
2014年发布的java SE 8和2017年发布的java EE 8,至今还是使用最广泛的java版本,大部分java开发者对于java 8之后的升级总是敬而远之,这跟java 9以后的破坏性升级和oracle的商用协议有关,但随着9月java 17的发布,我们有更多理由去升级和在新项目中使用更新的java了。
为什么要升级?
- java 9之后的Java改变了更新策略,java 11是8之后的第一个LTS版本,之后每隔半年更新一个小版本,三年更新一个LTS版本,所以java 17是下一个LTS版本。
- 最显著的改善是几乎免费获得的性能提升。java 8默认GC是Parallel GC,java 9 之后默认是G1 GC,且就算是同一个GC,新版本中的表现也会比旧版本性能好,我们的程序触发full GC的次数和GC造成的程序暂停会更短。关于这一点,有一篇文章分析了性能How much faster is Java 17?。除此之外,每一个新的Java版本,尤其是LTS版本,都包含改进,例如解决安全漏洞、改进性能和添加新功能。让java保持最新有助于项目的健壮性和安全性。开发人员通常也更想在日常工作中使用新技术。
- oracleJdk在11版本之后商用是需要付费的,17这个版本又改回了商用免费,openJdk和oracleJdk之间又可以自由选择了
- spring刚刚官宣2022年即将发布的spring framework 6.0和springboot 3.0版本最低要求java 17,且kafka 3.0版本之后也会弃用java 8,升级已经是一个趋势,未来更多框架和中间件会弃用java 8,作为开发人员也不能停止脚步
升级的注意事项
人们在java 8这个版本不愿意升级,除了怕影响项目稳定性,还有就是java 9之后的发布频率太快,但在多了解一点java 9之后的更新策略后就会知道非LTS版本是不需要升级,也不建议升级的,只有每隔三年发布的LTS版本才有必要升级(另外java 17之后oracle有个提议改动LTS版本发布频率,之后的LTS版本可能每两年发布一次);另一方面是有很多破坏性更改,升级后旧项目可能直接报错。但在java 8发布至今的7年后,升级的解决方案已经很成熟了,这些问题不应该还是我们升级的阻力
关于升级时可能遇到的问题我做了个汇总,以版本区分,升级时,也建议一步步升级,比如先升级到java11,没问题再升级到java17,便于发现升级时的问题。以下解决方案基于maven
第一步建议先升级依赖项
如果你的项目基于java 8,在升级前最好先升级依赖项,从java 8升级到java 17是一个很大的跨越,依赖项不升级则出问题的概率会比较高,maven可以用mvn versions:display-dependency-updates
命令检查依赖项更新,输出会类似这样
然后可以把依赖项升级到输出的对应版本,大部分包升级不会出问题,如果有问题,建议去出问题的依赖官方仓库寻找解决方案。这个命令是直接查询maven远程仓库,如果依赖项多的话会运行比较长的时间
各版本升级需要修改的内容
java 11
java 11删除了这些原本在jdk中的包:
- javaFX
- jdk自带的一些字体,主要影响Apache POI这类依赖字体的库,解决方法是自行在操作系统安装字体,比如Ubuntu,需要安装fontconfig包
apt install fontconfig
- JMC:Java Mission Control,java自带的性能分析工具,自java11后从jdk删除,可自行下载
- 删除java EE和CORBA模块,SE中删除java EE相关的包是因为这些包已经由java EE提供,而且由于oracle的政策,一些包的命名空间也改变了,例如JAXB包下的
javax.xml.bind.*
更改为jakarta.xml.bind.*
,下图列举了包名的改动,如果项目使用了这些包,需要在代码和pom.xml中更改相应包名
java 14
删除了CMS GC,对于老项目或针对CMS专门调优过的项目,建议升级后使用G1 GC
java 15
Nashorn JavaScript Engine在这个版本被移除,如果使用了则需要手动添加这个依赖项
<dependency> <groupId>org.openjdk.nashorn</groupId> <artifactId>nashorn-core</artifactId> <version>15.2</version> </dependency>
java 16
java 16也是一个改动很大的版本,这个版本默认对jdk内部的很多api做了强封装,默认情况下不可访问(可以通过选项--illegal-access
更改这个行为,但官方不建议),这个主要影响一些工具,比如lombok,而lombok在java 16发布后不久更新了版本解决这个问题。
如果实在找不到兼容的方法,则在pom.xml修改compiler plugin参数可以解决问题:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <fork>true</fork> <compilerArgs> <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg> <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg> <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg> <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg> <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg> <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg> <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg> <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg> <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED</arg> </compilerArgs> </configuration> </plugin>
如果升级到java 16,但lombok没有更新,则会报一个让你一头雾水的错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project broken: Compilation failure -> [Help 1]
除此之外没有更多信息了,这一点可以说是一个很大的坑
java 17
主要删除了一些实验性特性和老旧的API:
- applet API被弃用,估计也没有什么项目用到这个
- 实验性的AOT和JIT被删除,最近AOT的特性还是很火的,想使用这个特性的可以使用graalVM,spring native是spring基于graalVM的实现,使用spring native的java程序的启动时间会缩短到毫秒级,但也牺牲了一些运行时优化,可以说是java在云原生时代的进化,这里就不过多介绍了。
- 还有一个最大的变化是之前的
--illegal-access
参数不在可用,如果在java 17使用这个参数访问受限的api则会报出InaccessibleObjectException
,大多数情况下只要升级了依赖项是不会碰到这个情况的,但如果出现问题,则可以使用--add-opens
来对不可访问的api授权。
升级完成后可以做的事情
对开发人员来说最想做的自然是使用新的特性,包括var records instanceof switch这些新关键字和旧语法的改进,以及Stream和Optional等API的改进等,此处不在赘述。
结语
这里总结的是一些我自己升级过程中遇到的问题,只要将依赖项同步升级,基本可以解决升级会遇到的所有问题。当然不是所有项目都适合升级的,这里需要根据项目的情况仔细斟酌,如果是新项目,想跟上技术迭代的脚步,还是非常推荐升级到java 17的。
参考文章及链接:
- https://www.optaplanner.org/blog/2021/09/15/HowMuchFasterIsJava17.html
- https://www.infoq.com/articles/why-how-upgrade-java17/
- https://github.com/johanjanssen/JavaUpgrades
这篇关于java 8 - java 17 升级指北的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-10百万架构师第十三课:源码分析:Spring 源码分析:Spring核心IOC容器及依赖注入原理|JavaGuide
- 2025-01-10便捷好用的电商API工具合集
- 2025-01-09必试!帮 J 人团队解决物流错发漏发的软件神器!
- 2025-01-09不容小觑!助力 J 人物流客服安抚情绪的软件!
- 2025-01-09为什么医疗团队协作离不开智能文档工具?
- 2025-01-09惊叹:J 人团队用啥软件让物流服务快又准?
- 2025-01-09如何利用数据分析工具优化项目资源分配?4种工具推荐
- 2025-01-09多学科协作难?这款文档工具可以帮你省心省力
- 2025-01-09团队中的技术项目经理TPM:工作内容与资源优化策略
- 2025-01-09JIT生产管理法:优化流程,提升竞争力的秘诀