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 的编程模型下,用 ChatClient、Advisor、VectorStore 等抽象来屏蔽差异。
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
采纳建议与风险提示
- Koog 1.0:API 已稳定,适合在 Kotlin 项目中引入 Agent 编排。但 1.0 刚发布,社区生态(插件、示例)还不丰富,建议先用在内侧工具或非核心路径。
- Spring AI 2.0 M8:API 仍有变动可能。如果你在评估 Spring AI 作为 LLM 集成层,现在可以跑原型,但不要在正式发布前锁定生产代码。
- Endive:早期项目,API 和性能都未经过大规模验证。适合做技术预研和 PoC,不适合直接上生产。关注它的 GitHub 仓库,看后续是否支持 Wasm 组件模型(Component Model)和 SIMD 指令。
- 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→ 观察是否有破坏性变更