从 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
1
var list = new ArrayList<String>();
  • Switch 表达式(Java 12,13,14):Switch 可以作为表达式返回值,支持箭头语法。
java
1
2
3
4
5
String result = switch (day) {
  case "MON", "TUE" -> "Weekday";
  case "SAT", "SUN" -> "Weekend";
  default -> "Unknown";
};
  • 文本块(Java 13,14,15):支持多行字符串,使用 """ 语法。
java
1
2
3
4
5
6
String json = """
        {
            "name": "John",
            "age": 30
        }
        """;
  • Record 类(Java 14,15,16):简化不可变数据类的定义。
java
1
record Point(int x, int y) {}
  • Sealed 类(Java 15,16,17):限制类的继承,明确哪些类可以继承或实现。
java
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() 方法:建议使用 CleanerPhantomReference 替代。

工具和环境的调整

  • JDK 下载和安装:从 Oracle JDK 切换到 OpenJDK 或其他发行版(如 Adoptium、Amazon Corretto、Azul Zulu 等)。
  • 构建工具支持:确保 Maven、Gradle 等构建工具支持 Java 17.
    • Maven:maven-compiler-plugin 配置:
    xml
    1
    2
    3
    4
    
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    • Gradle:build.gradle 配置:
    groovy
    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 中已废弃或移除,需要检查并更新。

迁移步骤

  1. 备份项目:确保代码和配置已备份。
  2. 更新开发环境:安装 JDK 17,更新 IDE 和构建工具。
  3. 逐步升级:建议从 Java 8 升级到 Java 11,再升级到 Java 17,以减少兼容性问题。
  4. 测试和验证:运行单元测试和集成测试,确保工具类正常。
  5. 性能调优:根据新版本的特性调整 JVM 参数和代码。

资源推荐