JDK 28 简化 JSON 处理,Java 生态同步推进安全更新与框架发布

2026-07-27 12 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

2026 年 7 月 20 日这一周的 Java 动态横跨语言平台、安全补丁与应用框架:JDK 28 出现新的候选改进提案,JEP 540 计划孵化一套简单 JSON API,JEP 541 则开始为移除 macOS/x64 端口铺路;Oracle 发布季度关键补丁更新,Embabel 1.0、Azul Payara 7.2.0 和 Helidon 4.5.1 也在同一周期交付新版本。

这些更新看似分散,实际指向三个工程问题:JSON 处理能否减少第三方依赖、生产环境是否及时修补 JVM 漏洞,以及团队是否仍在为逐渐退出主流的硬件平台承担成本。

JEP 540:JDK 为什么需要简单 JSON API

Java 应用几乎都要处理 JSON,但 JDK 长期没有提供面向普通应用开发的通用 JSON API。项目通常在 Jackson、Gson、JSON-B 或 JSON-P 中选择一种,再围绕它建立对象映射、异常处理和配置规则。

JEP 540 的关键词是“Simple”和“Incubator”。前者意味着它瞄准常见 JSON 读写需求,而不是替代所有成熟 JSON 库;后者意味着 API 仍处于收集反馈、允许调整的阶段。仅根据提案标题和本周摘要,还不能假定其最终包名、模块名或对象映射能力已经稳定。

这类 API 的直接价值可能体现在小型命令行工具、JDK 内部工具、轻量服务和教学代码中。对于依赖多态反序列化、自定义注解、流式处理或复杂数据绑定的系统,成熟库依然有不可替代的价值。

团队评估它时应测量具体行为,而不只是比较代码行数:

  • 大整数和高精度小数是否会丢失精度;
  • 重复字段、未知字段和尾随内容如何处理;
  • 深层嵌套输入是否有资源限制;
  • 是否支持增量解析大型文档;
  • 错误信息能否指出输入位置;
  • 孵化模块升级后需要修改多少调用代码。

在孵化 API 稳定前隔离 JSON 边界

JEP 540 的正式 API 细节未包含在摘要中,因此不应凭空编造调用方式。可以这样实践:先通过一个很薄的接口隔离 JSON 实现。下面的 Maven 示例使用 Jakarta JSON Processing 作为可运行基线;以后试用 JDK 孵化 API 时,只需要替换 JsonCodec 的实现。

创建以下两个文件。运行前需要 JDK 17 或更高版本以及 Maven 3.9+。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>dev.example</groupId>
  <artifactId>json-boundary</artifactId>
  <version>1.0.0</version>

  <properties>
    <maven.compiler.release>17</maven.compiler.release>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>jakarta.json</artifactId>
      <version>2.0.1</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>3.5.0</version>
        <configuration>
          <mainClass>dev.example.Main</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

src/main/java/dev/example/Main.java

package dev.example;

import jakarta.json.Json;
import jakarta.json.JsonObject;
import jakarta.json.JsonReader;

import java.io.StringReader;

interface JsonCodec {
    String encodeBuild(String runtime, int featureVersion);
    BuildInfo decodeBuild(String json);
}

record BuildInfo(String runtime, int featureVersion) {}

final class JakartaJsonCodec implements JsonCodec {
    @Override
    public String encodeBuild(String runtime, int featureVersion) {
        return Json.createObjectBuilder()
                .add("runtime", runtime)
                .add("featureVersion", featureVersion)
                .build()
                .toString();
    }

    @Override
    public BuildInfo decodeBuild(String json) {
        try (JsonReader reader = Json.createReader(new StringReader(json))) {
            JsonObject value = reader.readObject();
            return new BuildInfo(
                    value.getString("runtime"),
                    value.getInt("featureVersion")
            );
        }
    }
}

public class Main {
    public static void main(String[] args) {
        JsonCodec codec = new JakartaJsonCodec();
        String json = codec.encodeBuild("OpenJDK", 28);
        BuildInfo decoded = codec.decodeBuild(json);

        System.out.println(json);
        System.out.println(decoded);
    }
}

执行:

mkdir -p src/main/java/dev/example
mvn -q compile exec:java

预期会输出一段 JSON 和反序列化后的 BuildInfo。这个示例的重点不是推荐某个库,而是让业务代码只依赖 JsonCodec。等 JEP 540 的 API 和模块使用方式明确后,可以增加第二个实现,并用同一组契约测试比较精度、异常和性能。

JEP 541:macOS/x64 进入退出倒计时

JEP 541 提议将 macOS/x64 端口标记为弃用并准备移除。这里需要区分“弃用”和“立即删除”:现有构建不会仅因为提案出现就立刻停止工作,但平台信号已经很清楚,维护预算将更多地流向 Apple Silicon 使用的 AArch64 架构。

对开发团队而言,风险往往不在纯 Java 代码,而在隐藏的平台耦合中:JNI 动态库、浏览器驱动、本地数据库工具、容器基础镜像,以及只存在于 x86 macOS 构建节点上的签名流程。可以先在 CI 和开发机上执行一轮盘点:

java -XshowSettings:properties -version 2>&1 \
  | awk -F' = ' '/os.name|os.arch|java.home/ {print $1 " = " $2}'

uname -m
mvn -q dependency:tree

如果输出包含 x86_64 或 JVM 的 os.arch = x86_64,应记录该机器承担的构建任务及其本地依赖。迁移到 Apple Silicon 时,还要验证产物是否被 Rosetta 隐式运行,避免把“能够启动”误当作原生兼容。

安全更新与框架版本应分开推进

本周同时出现 Oracle 2026 年 7 月关键补丁更新、Embabel 1.0 GA、Azul Payara 7.2.0 和 Helidon 4.5.1。它们不适合被合并成一次不可拆分的大升级。

关键补丁更新应按暴露面和漏洞影响确定优先级,并保留快速部署通道。框架升级则需要检查配置兼容性、依赖树、启动行为和接口回归。Embabel 进入 1.0 意味着它已到达首个正式发布节点,但“1.0”不等于可以跳过负载测试、故障注入和可观测性验证。Payara 与 Helidon 的版本更新也应先进入预发布环境,再根据发行说明决定测试范围。

一个稳妥的采用顺序是:

  1. 盘点生产环境的 JDK 厂商、版本、架构和补丁级别。
  2. 优先验证并部署关键安全补丁,不把它绑定到框架迁移。
  3. 在独立分支升级 Payara、Helidon 或 Embabel,每次只改变一个主要变量。
  4. 为 JSON 建立包含精度、非法输入、Unicode 和深层嵌套的契约测试。
  5. 在非生产项目试验 JDK 28 孵化 API,避免让业务模块直接依赖不稳定接口。
  6. 清理 macOS/x64 构建节点及本地二进制依赖,给迁移设置明确期限。

这轮更新中,最值得立即执行的不是追逐版本号,而是建立清晰边界:安全补丁快速推进,框架升级独立验证,孵化 API 通过适配层试用,退出中的平台通过资产清单有序迁移。


相关推荐