Endive 1.0 正式发布:WebAssembly 在 JVM 上以 Bytecode Alliance 名义推出
几个星期前,我们介绍了 新一代基于 WebAssembly 的 Java 库。SQLite、QuickJS、Protocol Buffers、Ruby Prism 解析器,统统编译成 Wasm,并以常规 JAR 包形式发布。无需 JNI,无需平台特定二进制文件。Wasm 只是实现细节。
今天,支撑这一切的运行时在 Bytecode Alliance 下发布了首个正式版本。Endive 1.0 已在 Maven Central 上可用。
发布内容
Endive 延续了 Chicory 的工作,后者是自 2023 年以来为这个生态系统提供动力的纯 Java WebAssembly 运行时。相同的 API、相同的社区、相同的代码库。迁移到 Bytecode Alliance 是组织层面而非技术层面的变动。关于分支和治理的详细信息,请参阅 公告文章。
对于现有 Chicory 用户,迁移只需查找替换。Maven 坐标从 com.dylibso.chicory 变更为 run.endive,Java 包也遵循相同模式。迁移指南 涵盖了完整列表。
除重命名外,Endive 1.0 还带来了新的技术成果。
WasmGC:更智能的库
上一篇文章重点介绍了封装 C 和 Rust 库。这些语言能直接编译成 Wasm,因为它们管理自己的内存。但越来越多的语言转而瞄准 WasmGC 提议:Kotlin/Wasm、Dart 等。Google Sheets 已经通过 WasmGC 在生产环境中运行其基于 Java 的计算引擎。Endive 通过了完整的 WasmGC 规范测试套件,并且项目测试套件已包含一个 Kotlin/Wasm hello-world 程序,以端到端验证集成:
标准 Kotlin,针对 WasmGC 和 WASI,无需任何更改即可通过 Endive 运行。
Endive 1.0 新增的是主机集成。当 GC 管理的对象(结构体、数组、externref 值)跨越 Wasm 和 Java 之间的边界时,现在由 JVM 垃圾回收器直接跟踪。无需单独存储,无需手动管理生命周期。注解处理器支持将 externref 视为普通 Object,因此宿主函数可以自然地与 GC 类型协同工作。
这为下一波基于 Wasm 的 Java 库奠定了基础,这些库由依赖垃圾回收而非手动内存管理的语言构建。如果你已经在主机边界使用了 WasmGC 类型,运行时会指导你进行小幅更新。详情请参阅 发布说明。
尾调用优化
CPython 3.14 在其解释器循环中采用了尾调用。Endive 编译器现在通过消除不必要的栈帧分配来优化尾调用分发。如果你在 Trino 中运行 Python UDF,这就是你能感受到的地方。
又一个 JAR:Java 的 tree-sitter
在前一篇文章中,每个示例都遵循相同的模式。拿一个久经考验的原生库,编译成 Wasm,打包成 JAR,发布到 Maven Central。
现在又有一个。
tree-sitter 是增量解析库,支撑着 Neovim、Zed、GitHub 的代码导航以及越来越多的编辑器和工具。它支持数十种语言语法,并能生成足够快的具体语法树以供实时编辑器使用。它是用 C 编写的,而在此之前,在 Java 中使用它意味着需要 JNI 绑定和平台特定的原生库。
treesitter4j 将 tree-sitter 及其语法(Java、XML、YAML、HTML、Markdown、JSON、Properties)编译成单个 Wasm 模块,并将其封装在 Java API 中。添加一个 Maven 依赖,解析任何支持的语言,就能获得语法树。
例如,Snowdrop 迁移工具(帮助团队将 Spring Boot 应用迁移到 Quarkus)刚刚采用 treesitter4j 作为其代码扫描器之一。它使用 tree-sitter 查询来查找 Java 类、注解、导入和属性文件,在迁移之前构建代码库的结构化映射。现在,任何 Java 工具都可以将 tree-sitter 的整个语法生态作为常规依赖使用。
与此同时,Reshapr(开源的无代码 MCP 服务器,用于 AI 原生 API 访问)正在添加 JavaScript 脚本 以支持自定义工具编排,由运行 QuickJS 的 QuickJs4J 通过 Wasm 驱动。无需嵌入式 V8,也无需 GraalJS。
又一个经过实战检验的原生库,又一个 classpath 上的 JAR,又一个如果用 JNI 会非常痛苦的使用场景。
超越库:Endive 作为宿主
库封装的特性仅仅是开始。在 5 月的 wasmCloud 社区电话会议 上,Bailey Hayes 使用 Endive 用 Java 构建了一个 wasmCloud 宿主,通过 NATS 调度工作负载。随后,该演示在 Eclipse Vert.x 应用中嵌入了 Wasm 函数与普通 Java 处理器:两条普通 Java 路由、两条 Wasm 路由、一个 HTTP 服务器、一个 JVM。Wasm 调用器只有三行代码。Java 调用者完全不知道它在与 WebAssembly 通信。
如果你想全面了解未来的发展方向,可以观看 JNation 2026 演讲,它端到端地介绍了整个生态系统。
为了对运行时进行压力测试,我们通过 GraalVM WebImage 将 javac 本身编译成 Wasm,并在 Endive 中运行回来。它产生了有效的 .class 文件。我们还通过构建时编译器端到端运行了一个 Scala.js WasmGC hello-world。这些并非用于生产环境。它们是那种能暴露边界情况并证明运行时能处理真实世界复杂性的练习。示例在 GitHub 上。
下一步计划
社区成员已经开始原型开发 组件模型 支持,这是 Wasm 组件之间类型化、语言中立的接口标准。基于 Cranelift 的原生编译也在进行中,这将在保持纯 Java 打包特性的同时带来接近原生的执行速度。
开始使用
文档、入门指南和完整迁移参考可在 endive.run 找到。源代码位于 github.com/bytecodealliance/endive。
如果你正在使用 Endive 构建东西,或者考虑为 JVM 封装一个原生库,我们很乐意听取你的想法。加入 Zulip 上的讨论。
有关此项目的更多信息:Foojay Podcast #98。 查看嵌入内容
该文章 Endive 1.0 Is Here: Wasm on the JVM Ships Under the Bytecode Alliance 最早发布于 foojay。