从 Java 1.8 升级到 Java 17 是一个较大的跨越,涉及许多新特性、API 变化和废弃功能的移除。
新特性和改进
Java 9 到 Java 17 引入了许多新特性,以下是一些关键点:
模块化系统(Jigsaw 项目,Java 9 引入)
- 模块化系统:Java 引入了模块化系统(
module-info.java),允许将代码组织成模块,明确依赖关系和访问权限
- 如果项目需要模块化,需要定义
module-info.java 文件
- 非模块化应用可以继续以类路径(classpath)方式运行
语言特性改进
- 局部变量类型推断(Java 10):使用
var 关键字声明局部变量。
1
|
var list = new ArrayList<String>();
|
- Switch 表达式(Java 12,13,14):Switch 可以作为表达式返回值,支持箭头语法。
1
2
3
4
5
|
String result = switch (day) {
case "MON", "TUE" -> "Weekday";
case "SAT", "SUN" -> "Weekend";
default -> "Unknown";
};
|
- 文本块(Java 13,14,15):支持多行字符串,使用
""" 语法。
1
2
3
4
5
6
|
String json = """
{
"name": "John",
"age": 30
}
""";
|
- Record 类(Java 14,15,16):简化不可变数据类的定义。
1
|
record Point(int x, int y) {}
|
- Sealed 类(Java 15,16,17):限制类的继承,明确哪些类可以继承或实现。
1
|
public sealed class Shape permits Circle, Square {}
|
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 配置:
1
2
3
4
|
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
|
1
2
|
sourceCompatibility = '17'
targetCompatibility = '17'
|
- 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 参数和代码。
资源推荐