引言

在 25.0.0.4 版本中,Open Liberty 宣布正式支持 Java 24

💡 Java 24 是 LTS 版本吗? 与 Java 21 不同,Java 24 不是长期支持(LTS)版本。它的支持周期将在下一个 Java 版本发布后结束。但尽管如此,Java 24 仍然带来了许多值得关注 and 尝试的新特性,特别是对于想要提前评估未来 Java 版本特性的开发者来说。

Open Liberty 25.0.0.4 版本不仅添加了对 Java 24 的支持,还带来了以下重要更新:

  1. Java 24 支持 – 全面支持最新的 Java 版本
  2. InstantOn 特性扩展 – 新增对 J2EEManagement、AppClientSupport 和 WsSecurity 的支持
  3. OpenTelemetry 审计日志 – 通过 MicroProfile Telemetry 2.0 将 Liberty 审计日志导出到 OpenTelemetry

本文将深入介绍这些新特性,并提供实用的配置示例。

Read more: Open Liberty 25.0.0.4 支持 Java 24:探索最新 Java 特性与 InstantOn 扩展

📌 快速预览 (TL;DR)

  • 运行环境:Open Liberty 25.0.0.4 + JDK 24。
  • 核心优势:支持分代 Shenandoah GC 与 AOT 类加载 (JEP 483)。
  • 运维更新:审计日志现可通过 mpTelemetry-2.0 直接导出至 OpenTelemetry。
  • 安全预警:Java 24 永久禁用了 Security Manager (JEP 486),需尽早规划迁移。

📊 技术演进:从 Java 21 LTS 到 Java 24

graph LR
    LTS["Java 21 (LTS)<br/>生产环境基石"] -- "特性继承" --> J24["Java 24 (最新预览)<br/>分代 Shenandoah + AOT"]
    J24 -- "InstantOn 扩展" --> LIB["Open Liberty 25.0.0.4"]
    LIB -- "统一观测" --> OTel["OpenTelemetry<br/>(含审计日志)"]

    style J24 fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
    style LIB fill:#fff8e1,stroke:#f9a825,stroke-width:2px

Open Liberty 25.0.0.4 新特性概览

🚀 Java 24 支持

Java 24 于 2025 年 3 月 18 日正式发布,带来了 24 个 JEP 的变更。虽然它不是 LTS 版本,但其中的许多特性都值得在企业环境中进行评估和测试。

⚡ InstantOn 特性扩展

Open Liberty 的 InstantOn 特性可以为 MicroProfile 和 Jakarta EE 应用提供毫秒级启动速度。在 25.0.0.4 版本中,InstantOn 支持扩展到以下特性:

  • J2EE Management 1.1 (j2eeManagement-1.1)
  • Application Client Support 1.0/2.0 (appClientSupport-1.0appClientSupport-2.0)
  • Web Service Security 1.1 (wsSecurity-1.1)

📊 OpenTelemetry 审计日志集成

现在可以将 Liberty 的审计日志通过 MicroProfile Telemetry 2.0 导出到 OpenTelemetry,实现统一的可观测性。


快速开始:在 Open Liberty 中使用 Java 24

环境准备

要在 Open Liberty 中运行 Java 24,只需以下几个简单步骤:

  1. 下载并安装 Open Liberty 25.0.0.4 或更高版本
  2. 获取 Java 24 运行时
    • 推荐从 Adoptium 下载 Eclipse Temurin 24
  3. 配置 JAVA_HOME
    • 编辑 Open Liberty 运行时的 server.env 文件
    • 将 JAVA_HOME 指向你的 Java 24 安装目录
  4. 启动测试
    • 现在可以开始测试你的应用程序了!

配置示例(server.env):

JAVA_HOME=/path/to/jdk-24

构建工具配置

Maven 配置

在 pom.xml 中添加以下插件配置:

<plugin>
    <groupId>io.openliberty.tools</groupId>
    <artifactId>liberty-maven-plugin</artifactId>
    <version>3.11.3</version>
</plugin>

Gradle 配置

在 build.gradle 中添加:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'io.openliberty.tools:liberty-gradle-plugin:3.9.3'
    }
}
apply plugin: 'liberty'

容器化部署

使用官方容器镜像:

FROM icr.io/appcafe/open-liberty:java24

💡 Docker 容器提示:如果你使用官方容器镜像(icr.io/appcafe/open-liberty:java24),通常不需要手动设置 JAVA_HOME,因为镜像已经预设好了 Java 24 环境。这使得容器化部署更加简单!


Java 24 核心新特性解析

Java 24 包含了 24 个 JEP 变更,以下是其中的亮点:

1. 分代 Shenandoah 垃圾收集器(JEP 404)⭐

Shenandoah 是一个低暂停时间的垃圾收集器,现在引入了分代模式,可以分别管理年轻代和老年代对象,进一步提高性能。

实验性特性:需要通过 JVM 参数启用:

java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=adaptive ...

2. 紧凑对象头(JEP 450)

通过压缩对象头来减少内存占用,特别是对于大量小对象的场景,可以显著降低堆内存使用。

实验性特性

java -XX:+UnlockExperimentalVMOptions -XX:+UseCompactObjectHeaders ...

3. 准备限制 JNI 的使用(JEP 472)

Java 24 开始逐步限制 JNI(Java Native Interface)的使用,鼓励开发者迁移到更安全的 Foreign Function & Memory API(在 Java 22 中成为正式特性)。

影响:如果你有使用 JNI 的代码,需要开始规划迁移路径。

4. G1 垃圾收集器的延迟屏障扩展(JEP 475)

优化了 G1 GC 的屏障扩展时机,将部分操作延迟到更合适的时机执行,从而减少暂停时间并提高吞吐量。

5. 类加载和链接的提前处理(JEP 483)⭐

Ahead-of-Time (AOT) Class Loading & Linking 允许在应用程序运行之前完成类的加载和链接,可以显著减少启动时间。

使用示例

# 在应用程序运行之前生成 AOT 缓存
java -XX:AOTMode=record -XX:AOTConfiguration=app.aot ...

# 使用 AOT 缓存启动应用程序
java -XX:AOTMode=on -XX:AOTConfiguration=app.aot ...

6. 类文件 API(JEP 484)

提供了一个新的 API 用于解析、生成和转换 Java 类文件,替代了第三方库如 ASM。

示例

// 使用新的 ClassFile API 读取类文件
ClassFile cf = ClassFile.of();
ClassModel classModel = cf.parse(bytes);

7. Stream 收集器(JEP 485)

增强了 Stream API,引入了 Gatherer 接口,允许自定义中间操作,提供了更灵活的流数据处理能力。

示例

// 使用自定义的收集器
Stream<String> stream = Stream.of("a", "b", "c", "d");
List<String> result = stream.gather(Gatherer.of(
    // 自定义处理逻辑
)).toList();

8. 永久禁用安全管理器(JEP 486)⚠️🔥 【重大破坏性变更】

🚨 强烈警告:这是 Java 24 最重大的破坏性变更!

如果你的应用程序依赖安全管理器,需要立即开始迁移工作!

Java 24 永久禁用了安全管理器(Security Manager),这意味着:

  • ❌ 不能再尝试用安全管理器启动 Java
  • ❌ 不能在运行时安装安全管理器
  • ❌ 不能使用 AccessController::checkPermission
  • ❌ 不能使用 Policy::setPolicy
  • ❌ 不能使用 SecurityManager::check*
  • ❌ 不能使用 Subject::getSubject

迁移指南

  1. 立即检查你的应用是否使用了 System.setSecurityManager() 或 SecurityManager
  2. 参考 JEP 486 的描述章节 了解迁移路径
  3. 考虑使用其他安全机制(如模块系统、代码签名等)替代安全管理器

💡 影响评估:这是 Java 现代化进程中的重要一步,虽然会带来短期的迁移成本,但长期来看将简化 Java 安全模型并提高性能。

9. 虚拟线程同步无固定(JEP 491)

进一步改进了虚拟线程的实现,在 synchronized 块中不再固定(pin)载体线程,提高了虚拟线程的吞吐量和可扩展性。

适用场景

// 在 Java 24 中,这个操作不会再固定载体线程
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    executor.submit(() -> {
        synchronized (lock) {  // 不再固定载体线程!
            // 执行操作
        }
    });
}

10. 其他重要 JEP

  • JEP 478:密钥派生函数 API(预览版)
  • JEP 479:移除 Windows 32 位 x86 移植版本
  • JEP 487:作用域值(第四次预览)
  • JEP 488:模式、instanceof 和 switch 中的基本类型(第二次预览)
  • JEP 489:向量 API(第九次孵化)
  • JEP 490:ZGC 垃圾收集器移除非分代模式
  • JEP 492:灵活的构造器主体(第三次预览)
  • JEP 493:无需 JMODs 链接运行时镜像
  • JEP 494:模块导入声明(第二次预览)
  • JEP 495:简单源文件和实例 main 方法(第四次预览)
  • JEP 496:抗量子模块格密钥封装机制
  • JEP 497:抗量子模块格数字签名算法
  • JEP 498:使用 sun.misc.Unsafe 的内存访问方法时发出警告
  • JEP 499:结构化并发(第四次预览)
  • JEP 501:弃用 32 位 x86 移植版本,准备移除

InstantOn 特性扩展

什么是 InstantOn?

Open Liberty 的 InstantOn 特性基于 Linux 内核的 CRIU(Checkpoint/Restore In Userspace)功能,可以对 JVM 做检查点快照,后续可直接恢复运行,实现毫秒级启动速度。

优势

  • ⚡ 毫秒级启动时间
  • 📊 不牺牲吞吐量
  • 💾 不增加内存占用
  • 🔄 保持开发-生产环境一致性
  • ☕ 支持所有 Java 语言特性

新增支持的特性

在 25.0.0.4 版本中,以下特性新增了对 InstantOn 的支持:

特性描述文档链接
j2eeManagement-1.1J2EE 管理 1.1链接
appClientSupport-1.0服务器应用客户端支持 1.0链接
appClientSupport-2.0服务器 Jakarta 应用客户端支持 2.0链接
wsSecurity-1.1Web 服务安全 1.1链接

💡 注意事项:InstantOn 仅支持部分 Open Liberty 特性。如果启用了支持列表外的公共特性,检查点操作会失败并抛出错误信息。


通过 OpenTelemetry 收集 Liberty 审计日志

为什么需要审计日志?

审计日志记录了运行时环境的安全相关事件,对于安全合规和故障排查非常重要。

审计日志流向图

graph LR
    A[Security Events] --> B[Liberty Audit 2.0]
    B --> C{mpTelemetry 2.0}
    C -->|Export| D[OpenTelemetry Collector]
    C -->|Local| E[audit.log]
    
    style C fill:#fff4e1,stroke:#d4a017,stroke-width:2px

配置示例

要收集审计日志并发送到 OpenTelemetry,只需在 server.xml 中添加以下配置:

<featureManager>
   <feature>audit-2.0</feature>
   <feature>mpTelemetry-2.0</feature>
</featureManager>

<mpTelemetry source="audit"/>

高级配置:指定审计事件

你还可以通过 auditFileHandler 元素指定要捕获并路由到 OpenTelemetry 的审计事件和结果:

<auditFileHandler maxFiles="5" maxFileSize="20" compact="true">
    <events name="AuditEvent_1" eventName="SECURITY_AUTHN" outcome="SUCCESS"/>
    <events name="AuditEvent_2" eventName="SECURITY_AUTHN" outcome="REDIRECT"/>
    <events name="AuditEvent_3" eventName="SECURITY_AUTHN" outcome="FAILURE"/>
    <events name="AuditEvent_4" eventName="SECURITY_AUTHZ"/>
</auditFileHandler>

可观测性统一

通过 MicroProfile Telemetry 2.0,你现在可以统一收集以下类型的遥测数据:

  • ✅ 分布式追踪(Tracing)
  • ✅ 指标(Metrics)
  • ✅ 日志(Logs)
  • ✅ 审计日志(Audit Logs) – 新增!

安全漏洞修复

25.0.0.4 版本修复了以下安全漏洞:

CVE 编号CVSS 评分漏洞评估受影响版本备注
CVE-2025-251935.5拒绝服务21.0.0.2 ~ 25.0.0.3影响 grpc-1.0 和 grpcClient-1.0 特性
CVE-2025-231845.9拒绝服务17.0.0.3 ~ 25.0.0.3影响 jaxws-2.2xmlWS-3.0 和 xmlWS-4.0 特性

Open Liberty 开发工具支持

Open Liberty 为各大主流 IDE 提供了优秀的开发工具支持:

这些工具提供了高效的开发、测试、调试和应用程序管理功能,全部在你的 IDE 中完成!


迁移建议与最佳实践

从 Java 21 迁移到 Java 24

虽然 Java 24 不是 LTS 版本,但提前了解和测试新特性对于以下场景非常有价值:

  1. 评估未来 LTS 版本:Java 25 或 26 可能会将 Java 24 中的预览特性转为正式特性
  2. 测试兼容性:提前发现应用程序在新版本 Java 中的兼容性问题
  3. 利用新特性:如果某些新特性可以为你的应用带来性能提升,可以考虑使用

重点测试领域

  1. 安全管理器依赖:如果你的应用使用了安全管理器,需要立即规划迁移
  2. JNI 使用:如果有 JNI 代码,需要评估迁移到 Foreign Function & Memory API 的工作量
  3. 虚拟线程性能:测试 JEP 491 带来的虚拟线程性能改进
  4. AOT 类加载:评估 JEP 483 是否可以改善你的应用启动时间

生产环境建议

⚠️ 生产环境提示:由于 Java 24 不是 LTS 版本,建议在开发和环境测试中使用,生产环境仍然推荐使用 Java 21 LTS


参考资料


总结

Open Liberty 25.0.0.4 对 Java 24 的支持,为 Java 开发者提供了提前体验最新 Java 特性的机会。虽然 Java 24 不是 LTS 版本,但其中的许多特性(如分代 Shenandoah、AOT 类加载、虚拟线程改进等)都值得关注和测试。

同时,InstantOn 特性的扩展和 OpenTelemetry 审计日志集成为 Open Liberty 的可观测性和启动性能带来了显著提升。

无论你是正在运行微服务架构,还是开发传统的企业应用,现在都可以在开发环境中尝试 Java 24 和 Open Liberty 的最新特性了!


立即体验:

欢迎在评论区分享你使用 Java 24 新特性的经验和心得!


相关阅读: