从 Java 1.8 升级到 Java 17 是一个较大的跨越,涉及许多新特性、API 变化和废弃功能的移除。
新特性和改进
Java 9 到 Java 17 引入了许多新特性,以下是一些关键点:
模块化系统(Jigsaw 项目,Java 9 引入)
- 模块化系统:Java 引入了模块化系统(
module-info.java
),允许将代码组织成模块,明确依赖关系和访问权限 - 如果项目需要模块化,需要定义
module-info.java
文件 - 非模块化应用可以继续以类路径(classpath)方式运行
语言特性改进
- 局部变量类型推断(Java 10):使用
var
关键字声明局部变量。
java
|
|
- Switch 表达式(Java 12,13,14):Switch 可以作为表达式返回值,支持箭头语法。
java
|
|
- 文本块(Java 13,14,15):支持多行字符串,使用
"""
语法。
java
|
|
- Record 类(Java 14,15,16):简化不可变数据类的定义。
java
|
|
- Sealed 类(Java 15,16,17):限制类的继承,明确哪些类可以继承或实现。
java
|
|
API 增强
- 新的集合工厂方法(Java 9):
List.of()
,Set.of()
,Map.of()
等。 - Stream API 增强:
takeWhile()
,dropWhile()
,ofNullable()
等方法。 - HTTP/2 客户端(Java 11):新的
HttpClient
API 支持 HTTP/2 的 WebSocket。 - 垃圾回收器改进:G1 成为默认垃圾回收器,ZGC 和 Shenandoah 提供低延迟选项。
性能改进
- JIT 编译器改进:GraalVM 和 JVMCI 的支持。
- 应用程序类数据共享(AppCDS):减少启动时间和内存占用。
废弃和移除的功能
- 移除了 Java EE 和 CORBA 模块:从 Java 9 开始逐步移除,Java 11 完全移除,可以手动添加依赖(如 Jakarta EE)。
- 移除了 Nashorn JavaScript 引擎:从 Java 17 移除,如果需要可以使用 GraalVM 的 JavaScript 支持。
- 移除了
javafx
:从 Java 11 开始,Java FX 被分离出 JDK,需要单独下载。 - 废弃了
finalize()
方法:建议使用Cleaner
或PhantomReference
替代。
工具和环境的调整
- JDK 下载和安装:从 Oracle JDK 切换到 OpenJDK 或其他发行版(如 Adoptium、Amazon Corretto、Azul Zulu 等)。
- 构建工具支持:确保 Maven、Gradle 等构建工具支持 Java 17.
- Maven:
maven-compiler-plugin
配置:
xml1 2 3 4
<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties>
- Gradle:
build.gradle
配置:
groovy1 2
sourceCompatibility = '17' targetCompatibility = '17'
- Maven:
- IDE 支持:确保 IDE(如 IntelliJ IDEA、Eclipse)支持 Java 17
兼容性和迁移注意事项
- 依赖库兼容性:检查项目中使用的第三方库是否支持 Java 17.
- 反射 API 的限制:模块化系统对反射访问进行了限制,可能需要调整模块描述文件或添加
--add-opens
参数。 - 废弃 API 的替换:替换项目中使用的废弃 API,如
javax.xml.bind
替换为jakarta.xml.bind
。 - 启动参数调整:某些 JVM 参数在 Java 17 中已废弃或移除,需要检查并更新。
迁移步骤
- 备份项目:确保代码和配置已备份。
- 更新开发环境:安装 JDK 17,更新 IDE 和构建工具。
- 逐步升级:建议从 Java 8 升级到 Java 11,再升级到 Java 17,以减少兼容性问题。
- 测试和验证:运行单元测试和集成测试,确保工具类正常。
- 性能调优:根据新版本的特性调整 JVM 参数和代码。
感谢您的耐心阅读!来选个表情,或者留个评论吧!