Java 生态周报:JDK 27 JEP 调整、Koog 1.0 正式发布、Endive 登场——JVM 上跑 Wasm 的新选择

2026-06-02 23 预计阅读时间:1 分钟
来源:infoq.com AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:10 分钟

2026 年 5 月最后一周,Java 生态同时出现了几条值得动手验证的消息:JDK 27 两个 JEP 的生命周期状态发生变化,Koog 1.0 从实验走向 GA,Spring AI 2.0 推进到第八个里程碑,而一个名为 Endive 的项目试图让 WebAssembly 直接在 JVM 上原生运行。下面逐项拆解,并给出可以立刻试跑的示例。

JDK 27:两个 JEP 的生命周期变动

JDK 27 的开发周期正在进行中,本周值得关注的是两个 JEP 的状态调整。JEP 的生命周期通常经历 Draft → Candidate → Targeted → Integrated 等阶段,状态变动意味着这些特性离最终交付更近或更远。

对于日常开发来说,JEP 状态变化本身不需要你立即改代码,但它决定了你未来能用什么。建议定期关注 OpenJDK JEP 页面,尤其是与性能、并发、语言语法相关的 JEP——它们往往直接影响你写业务代码的方式。

快速查看当前 JDK 27 已 Targeted 的 JEP 列表:

# 使用 jwebserver 快速浏览 OpenJDK JEP(需要 JDK 21+)
curl -s https://openjdk.org/jeps/0 | grep -i "jdk 27" | head -20

# 或者直接用浏览器打开
# https://openjdk.org/jeps/8307223  ← 查看具体 JEP 状态

Koog 1.0 GA:用 Kotlin DSL 写 AI Agent

Koog 是 JetBrains 推出的 Kotlin DSL 框架,专门用于编写 AI Agent 工作流。从早期预览到本周的 1.0 GA,意味着 API 已经稳定,可以在生产中使用。

核心思路:用 Kotlin 的类型安全和 DSL 语法,把 Agent 的工具调用、上下文管理、多步推理编排成可读、可维护的代码,而不是散落在 JSON prompt 里。

下面是一个最小可运行的 Koog Agent 示例——定义一个能查天气并给出建议的 Agent:

// build.gradle.kts 中添加依赖
dependencies {
    implementation("org.jetbrains.koog:koog-core:1.0.0")
    implementation("org.jetbrains.koog:koog-agents:1.0.0")
}

// WeatherAgent.kt
import org.jetbrains.koog.agent.*
import org.jetbrains.koog.agent.tool.*

fun main() {
    val agent = agent {
        name = "weather-advisor"
        description = "根据城市名称查询天气并给出出行建议"

        // 注册工具:模拟天气查询
        tool("getWeather") {
            description = "查询指定城市的当前天气"
            parameter("city", String, "城市名称,如 Beijing、Shanghai")

            execute { params ->
                val city = params["city"] as String
                // 实际项目中替换为真实 API 调用
                "城市 $city 当前气温 28°C,多云,湿度 65%"
            }
        }

        // Agent 的推理指令
        instructions = """
            你是一个天气顾问。用户告诉你城市名,
            你调用 getWeather 工具查询天气,
            然后根据结果给出是否适合户外活动的建议。
        """.trimIndent()
    }

    // 运行 Agent
    val result = agent.run("我想知道北京今天适不适合跑步")
    println(result)
}

运行前需要配置 LLM 后端(如 OpenAI API Key),在 agent 块中追加 model 配置即可。Koog 1.0 GA 的意义在于:DSL 不再频繁变动,你可以放心在项目里引入。

Spring AI 2.0 Milestone 8:离正式版又近一步

Spring AI 2.0 已经推进到第八个里程碑。这个项目把各类 LLM 提供商(OpenAI、Azure、Ollama 等)统一到 Spring 的编程模型下,用 ChatClientAdvisorVectorStore 等抽象来屏蔽差异。

M8 阶段 API 仍有变动风险,但如果你想提前验证架构,现在是个好时机。一个最简的 Spring AI 2.0 ChatClient 用法:

// pom.xml
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
    <version>2.0.0-M8</version>
</dependency>

// application.yml
spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      chat:
        options:
          model: gpt-4o
          temperature: 0.7

// ChatService.java
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;

@Service
public class ChatService {

    private final ChatClient chatClient;

    public ChatService(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    public String ask(String question) {
        return chatClient.prompt()
                .user(question)
                .call()
                .content();
    }
}

注意:M8 的依赖需要从 Spring Milestone 仓库拉取,在 pom.xml 中添加:

<repositories>
    <repository>
        <id>spring-milestones</id>
        <url>https://repo.spring.io/milestone</url>
    </repository>
</repositories>

Endive:JVM 原生 WebAssembly 运行时

Endive 是本周亮相的新项目,定位为 JVM-native WebAssembly 运行时——也就是说,它不依赖外部 Wasm 运行时(如 Wasmtime 的 JNI 绑定),而是用纯 JVM 字节码实现 Wasm 的解释/编译执行。

这个方向的实际价值在于:如果你在 JVM 应用中需要运行 Wasm 模块(比如嵌入第三方沙箱逻辑、跨语言插件系统),Endive 可以避免 JNI 调用带来的安全边界模糊和部署复杂度。

目前 Endive 还处于早期阶段,但已经可以跑基本的 Wasm 模块。一个概念验证示例:

// 假设 Endive 已发布到 Maven Central(实际发布渠道请查看项目 README)
// pom.xml
<dependency>
    <groupId>org.endive</groupId>
    <artifactId>endive-runtime</artifactId>
    <version>0.1.0</version>
</dependency>

// WasmRunner.java
import org.endive.runtime.WasmEngine;
import org.endive.runtime.WasmModule;

public class WasmRunner {
    public static void main(String[] args) throws Exception {
        WasmEngine engine = WasmEngine.create();

        // 加载一个 .wasm 文件(例如用 wasm-tools 编译的简单加法模块)
        WasmModule module = engine.loadModule(
            WasmRunner.class.getResource("/add.wasm").getPath()
        );

        // 调用导出函数 add(i32, i32) -> i32
        int result = module.invoke("add", 3, 7);
        System.out.println("3 + 7 = " + result);  // 输出 10
    }
}

对应的 WAT 文件(编译为 add.wasm):

(module
  (func $add (param i32 i32) (result i32)
    local.get 0
    local.get 1
    i32.add)
  (export "add" (func $add)))

wat2wasm 工具编译:

# 安装 wabt 工具链后
wat2wasm add.wat -o add.wasm

注意:Endive 的 API 尚未稳定,上述代码基于项目公开文档的典型用法推断。实际类名和方法签名请以项目 GitHub 仓库为准。

其他点版本更新

本周还有几个稳定的点版本发布,升级成本很低:

项目 版本 升级关注点
Hazelcast 5.x 新点版本 分布式缓存与 IMDG 性能修复
Quarkus 3.x 新点版本 统一启动时间优化与扩展兼容性
Hibernate 6.x 新点版本 ORM 映射与查询性能修复
JHipster 8.x 新点版本 生成器模板更新,微服务架构脚手架改进

对于这些点版本,通常只需要改版本号然后跑一遍测试:

# Quarkus 项目升级示例
mvn quarkus:update -Dquarkus.platform.version=3.x.y

# Hibernate 升级只需改 pom.xml 版本号,然后
mvn clean test

采纳建议与风险提示

  1. Koog 1.0:API 已稳定,适合在 Kotlin 项目中引入 Agent 编排。但 1.0 刚发布,社区生态(插件、示例)还不丰富,建议先用在内侧工具或非核心路径。
  2. Spring AI 2.0 M8:API 仍有变动可能。如果你在评估 Spring AI 作为 LLM 集成层,现在可以跑原型,但不要在正式发布前锁定生产代码。
  3. Endive:早期项目,API 和性能都未经过大规模验证。适合做技术预研和 PoC,不适合直接上生产。关注它的 GitHub 仓库,看后续是否支持 Wasm 组件模型(Component Model)和 SIMD 指令。
  4. JDK 27 JEP:不需要现在改代码,但建议你标记与自己业务相关的 JEP(比如值类型、字符串模板等),在 JDK 27 Early Access 构建出来后尽早做兼容性测试。

快速验证清单:

  • ✅ Koog 1.0:在 Kotlin 项目中写一个单工具 Agent,跑通调用链
  • ✅ Spring AI 2.0 M8:用 ChatClient 对接一个 LLM,验证 prompt 链路
  • ✅ Endive:编译一个最小 Wasm 模块,在 JVM 中加载执行
  • ✅ 点版本升级:改版本号 → mvn test → 观察是否有破坏性变更

相关推荐