企业互操作轻松实现:面向 Java 开发者的 WASM 编译库

发布: (2025年12月3日 GMT+8 18:56)
4 min read
原文: Dev.to

Source: Dev.to

Cover image for Enterprise Interop Made Easy: WASM Compiled Libraries for Java Developers

介绍

WebAssembly(WASM)正迅速演变为 “通用虚拟机”。 最初设计用于让浏览器运行非 JavaScript 代码,WASM 现在支持 C/C++、Rust、Go、Zig 等工具链,以及 Python、C# 等高级语言,使其成为强大的跨平台运行时。

WASM 与 JVM:两种栈机器

WASM 虚拟机Java 虚拟机(JVM) 都是 基于栈的机器。这种架构相似性使得将 WASM 字节码编译为 JVM 字节码成为可能。像 Chicory 这样的项目通过将 WASM 模块转换为原生 JVM 类来演示了这一点。

这种方法解决了一个长期存在的问题:

如何在不重写全部代码的情况下,在现代工具链中复用已有的 C/C++ 库?

传统上,开发者面临两种选择:

  • Java 方式 – 为了可移植性和安全性,将所有代码重写为 Java。
  • Python 方式 – 通过共享库/DLL 包装本地库,以实现快速集成。

每种方式都有权衡:

  • Java – 沙箱执行,但需要对大型代码库进行代价高昂的重写。
  • Python – 通过包装实现快速集成,但需要平台特定的 DLL/共享库。

WASM 作为桥梁

有了 WASM,你可以避免“重写还是包装”的两难:

  1. 将已有的 C/C++ 代码编译为 WASM。
  2. 使用 Chicory 将 WASM 转换为 JVM 类。
  3. 将结果以本地 Java 库的形式暴露。

最终得到的是一个 纯 JVM 产物——没有外部 DLL,也没有本地依赖——同时仍然利用了成熟的 C/C++ 库。

概念验证:Java 中的 DOCX 转 PDF

一个能够将 Microsoft Word .docx 文件渲染为 PDF 的非平凡 C/C++ 库被编译为 WASM,随后转译为通过 Maven 发布的本地 Java 库:WordSDK Java HelloWorld

Docx4J 的集成示例如下:

WordSDK.Worker api = WordSDK.createWorker(options);
// Create an import stream for feeding into WordSDK
OutputStream importStream = api.createImportStream();
// Feed the DOCX4J document into WordSDK
Docx4J.save(wordMLPackage, importStream, Docx4J.FLAG_NONE);
// Generate an in‑memory PDF for further processing...
byte[] pdf = api.exportPDF();

结果是一个 原生 JVM 库,它消费了 WASM 编译的 C/C++ 代码,能够无缝集成到 Java 企业工作流中。你可以在 WordSDK Java HelloWorld 仓库 亲自尝试。

性能

一个常见的问题是:“它有多快?”
通过 Chicory 在 JVM 中运行 WASM 模块的性能可与在 Node.js 等环境中执行 WASM 相媲美。与原生执行相比会有适度的开销——这与在 JVM 或其他托管运行时中运行代码时已经接受的权衡类似。

为什么这很重要

  • 企业相关性 – 许多系统仍然高度依赖 Java。
  • 安全性 – 没有本地 DLL 或系统调用;所有代码都在 JVM 沙箱内运行。
  • 可移植性 – WASM 本身即是跨平台的设计。
  • 面向未来 – WASM 正在成为通用的编译目标,正如 JVM 曾经对 Java 所起的作用。

特别感谢

衷心感谢 Chicory 项目。它能够将非平凡的 WASM 模块编译成 JVM 类,这对跨生态系统的开发者来说是一次革命性的突破。

Back to Blog

相关文章

阅读更多 »

Blender 插件开发需要更多 DevOps

概述 编写测试代码并实现自动化。在多个 Blender 版本上运行测试,以安心发布。个人开发者,无论是已经是还是想成为的……