当寻找能够在 Java 中显示 HTML、执行 JavaScript 或使用 OAuth2 协议的解决方案时,我们通常会考虑一个功能完备的嵌入式浏览器。如果您决定使用 Chromium 内核,那么您可以选择 Fuzio 或 Java Chromium Embedded Framework(JCEF)来实现集成。
我们收集了最常见的对比要点,并为您整理了本指南。为了帮助您在这两个库之间做出选择,我们将对它们的架构、功能覆盖、对信创平台的支持以及所需的集成工作量进行比较。
您也可以查看 Fuzio 与其他方案的对比:
概览
| JCEF | Fuzio | |
|---|---|---|
| 授权类型 | 开源 | 商业 |
| 底层引擎 | Chromium(基于 CEF) | Chromium(自研集成) |
| API 规模 | 47 个接口,60 个类 | 60+ 个包,580+ 个类与接口 |
| 支持的 UI 工具包 | Swing | Swing、JavaFX、SWT、Compose Desktop |
| 编程语言 | Java | Java、Kotlin |
| Java 进程内存隔离 | 不支持 | 支持 |
| 信创平台 | 不支持 | 原生支持麒麟 / LoongArch |
| 每年发布次数 | 无官方版本发布 | 持续更新(约每月一次) |
| 技术支持 | 不提供 | 提供中文技术支持,含 SLA |
JCEF 是一款开源且免费的工具,对于开源、低预算或学术项目来说,它可能是一个可行的方案。
但是,JCEF 仍然需要可观的维护成本。您的开发团队需要投入额外的时间和专业知识来处理 JCEF 社区未涵盖的部分:
- 维护不同平台的构建基础设施。
- 定期构建和打包 JCEF 的新版本。
- 在 macOS 和 Windows 上对二进制文件进行公证和签名。
- 修复问题并实现新功能。
相比之下,Fuzio 无需任何维护工作。您可以在 5 分钟内开始使用。该库提供了更多功能,并对所有 UI 工具包提供了原生支持。如果您缺少某个功能、发现了问题或有任何疑问,您可以随时寻求我们的帮助。
入门
JCEF 是基于 Chromium Embedded Framework(CEF)构建的开源库,允许您将网页浏览器嵌入到 Java Swing 桌面应用程序中。
要开始使用 JCEF,您需要自行构建它。该过程包含三个步骤:
- 配置环境。
- 编译二进制文件和 Java 类。
- 将所有内容打包为 JAR 文件,并添加到您的应用程序中。
Fuzio 是一款商业库。要开始使用 Fuzio,只需将依赖添加到您的 Gradle 或 Maven 项目中即可。或者,您也可以下载该库,并将 Fuzio 添加到类路径中。
Fuzio 的 JAR 文件包含了所有必要的二进制文件,因此开发者无需执行任何额外操作。其中 macOS 的二进制文件已经过苹果公司的公证,Windows 的二进制文件也已经过签名。
内部结构
JCEF 和 Fuzio 都是基于 Chromium 内核构建的。
JCEF 基于 CEF 构建——CEF 是一个知名的 C++ 框架,同时也为其他编程语言提供绑定支持。
Fuzio 则采用内部自研方案来实现 Chromium 的集成,不基于 CEF。
支持的 UI 工具包
JCEF 提供了一个 Swing 组件。如果您使用 JavaFX 或 SWT 开发应用程序,则需借助集成桥来实现连接。具体而言,JavaFX 可利用 SwingNode,而 SWT 则可通过 SWT_AWT 桥接器来实现。
Fuzio 为所有主流 UI 工具包提供了原生组件:
| UI 工具包 | 组件 |
|---|---|
| Swing | tech.fuzio.view.swing.BrowserView |
| JavaFX | tech.fuzio.view.javafx.BrowserView |
| Compose Desktop | tech.fuzio.view.compose.BrowserView |
| SWT | tech.fuzio.view.swt.BrowserView |
您可以在快速入门指南中了解如何使用任何工具包创建简单的应用程序。
我们的客户还将 Fuzio 应用于 Eclipse RCP、IntelliJ IDEA 和 NetBeans 插件中。
桌面嵌入
编写一个简单的桌面应用程序,对于这两个库来说,所需的工作量是相似的。以下是一个简单的示例:
JCEF
public static void main(String[] args) {
if (!CefApp.startup(args)) {
System.out.println("Startup initialization failed!");
return;
}
var offscreen = false;
var settings = new CefSettings();
settings.windowless_rendering_enabled = false;
var cefApp = CefApp.getInstance(settings);
var client = cefApp.createClient();
client.addMessageRouter(CefMessageRouter.create());
var url = "https://fuzio.tech/";
var transparent = false;
var browser = client.createBrowser(url, offscreen, transparent);
var frame = new JFrame("JCEF");
frame.add(browser.getUIComponent(), BorderLayout.CENTER);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.setSize(1280, 900);
frame.setVisible(true);
}
Fuzio
public static void main(String[] args) {
var engine = Engine.newInstance(HARDWARE_ACCELERATED);
var browser = engine.newBrowser();
browser.navigation().loadUrl("https://fuzio.tech/");
SwingUtilities.invokeLater(() -> {
var view = BrowserView.newInstance(browser);
var frame = new JFrame("Fuzio");
frame.add(view, BorderLayout.CENTER);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.setSize(1280, 900);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
engine.close();
}
});
});
}
无头模式嵌入
如果您的应用程序在没有 UI 的情况下运行,那么 JCEF 并不适合您。JCEF 需要一个可见的 Swing UI,否则浏览器将无法完全初始化。
而使用 Fuzio,您可以创建一个功能完备的浏览器,并真正实现离屏渲染:
public static void main(String[] args) {
try (var engine = Engine.newInstance(OFF_SCREEN)) {
var browser = engine.newBrowser();
browser.resize(1280, 1024);
browser.navigation().loadUrlAndWait("https://fuzio.tech/");
// 浏览器已启动并运行。让我们截图并检查一下。
var bitmap = browser.bitmap();
var image = BitmapImage.toToolkit(bitmap);
try {
ImageIO.write(image, "PNG", new File("screenshot.png"));
} catch (IOException e) {
System.out.println("Failed to save an image. " + e.getMessage());
}
}
}
API 与功能
JCEF 提供了多种功能来管理 Chromium 网络、打印、下载处理等操作。
使用 Fuzio,您不仅可以做到与 JCEF 相同的事情,还能实现更多功能。以下是 Fuzio 提供而 JCEF 并不具备的功能。
JavaScript 和 Java 之间的交互
从 Java 执行 JavaScript 代码,也可以从 JavaScript 调用 Java 方法,并享受自动类型转换的便利。请查看以下示例,或参阅指南。
// 从 JavaScript 中获取对象。作为字符串
String string = frame.executeJavaScript("'A string literal'");
// 作为数组。
JsArray array = frame.executeJavaScript("[0, 1, 2, 3, 4]");
// 或作为通用的 JavaScript 对象。
JsObject window = frame.executeJavaScript("window");
// 将任何 Java 对象传递给 JavaScript 环境。
window.putProperty("java", new MyJavaObject());
模拟用户输入
通过模拟用户交互来增强您的自动化测试和工具。
var rect = buttonElement.boundingClientRect();
var center = Point.of(
rect.x() + rect.width() / 2,
rect.y() + rect.height() / 2);
browser.dispatch(MousePressed.newBuilder(center)
.button(MouseButton.PRIMARY)
.build());
browser.dispatch(MouseReleased.newBuilder(center)
.button(MouseButton.PRIMARY)
.build());
操作 DOM
通过一个易于理解的 Java API,充分利用浏览器的强大功能。请查看 DOM 指南了解更多:
// 在 DOM 树中查找节点。通过标签名称查找。
List<Element> links = document.findElementsByTagName("a");
// 通过 CSS 选择器查找。
Optional<Element> logo = document.findElementByCssSelector("#logo");
// 甚至可以通过 JavaScript 查找。
FormElement form = document.frame().executeJavaScript("document.forms[0]");
// 访问属性。
links.forEach(link -> link.putAttribute("target", "blank"));
// 提交表单。
form.submit();
// 滚动到元素位置。
logo.ifPresent(l -> l.scrollIntoView(BOTTOM));
专有编解码器
像 H.264、HEVC 和 AAC 编解码器这样的专有技术默认是禁用的,但可以在运行时启用:
var options =
EngineOptions.newBuilder(HARDWARE_ACCELERATED)
.enableProprietaryFeature(ProprietaryFeature.AAC)
.enableProprietaryFeature(ProprietaryFeature.HEVC)
.enableProprietaryFeature(ProprietaryFeature.H_264)
.build();
var engine = Engine.newInstance(options);
启用专有编解码器后,您可以像 Google Chrome 一样加载包含 AAC、HEVC 和 H.264 格式的网页,播放音频和视频文件。默认情况下,专有编解码器是禁用的。
详细说明请参阅媒体指南。
Chrome 扩展程序
您可以安装、更新并与几乎所有 Chrome 扩展程序交互,无论是来自 Chrome 应用商店,还是通过本地的 CRX 文件安装。
扩展程序可以增强浏览器的功能,让用户体验更加高效、便捷。它们提供了一种经济高效的方式,使用户能够访问某些原本在桌面软件中难以实现或成本较高的功能。
欢迎查看我们的指南,了解如何在 Fuzio 中安装和使用 Chrome 扩展程序。
还有更多功能
Fuzio 还提供了许多独有的功能,例如:
- 管理 Chromium 配置文件
- 管理密码
- 自动填充网页表单
- 打印预览对话框
- 开箱即用的单点登录(SSO)支持
- 在离屏渲染模式下支持 HTML 标签
- 在离屏渲染模式下支持拖放操作
- WebRTC 和屏幕共享
- 以及更多功能
架构
这两种库之间的主要架构差异在于它们的处理模型。JCEF 在 Java 进程内启动 Chromium,而 Fuzio 则在一个独立的本地进程中启动 Chromium。
JCEF 的模型允许您更快地初始化 Chromium,但它有几大缺点:
- Chromium 会消耗 Java 进程的内存和 CPU。 创建的 Chromium 实例越多,应用程序占用的资源就越多。
- Chromium 中的任何崩溃都可能会导致 JVM 崩溃。 JVM 崩溃会终止 Java 应用程序,并可能导致用户数据丢失。
- Java 进程容易受到 Chromium 安全漏洞的影响。
Fuzio 在单独的进程中运行 Chromium,并通过进程间通信(IPC)与其进行通信。这样,Chromium 就不会影响 Java 进程的内存使用。
如果 Chromium 崩溃,Java 进程将继续运行。Fuzio 提供了 API 让您的应用程序能够在 Chromium 崩溃时获得通知,使您能够重新启动浏览器并恢复用户会话。
Fuzio 架构的安全优势:
- 内存隔离 — Chromium 的内存分配不影响 Java 应用的堆内存。
- 崩溃隔离 — Chromium 崩溃不会导致 Java 进程退出。
这种架构对于商业软件至关重要,终端用户的数据安全得到了保证。
信创平台支持
这是 Fuzio 与 JCEF 之间一个重要的差异点。
JCEF 是基于 CEF 的开源项目,不提供对国产信创操作系统和处理器的官方支持。如果您的应用需要在银河麒麟(Kylin)、开放麒麟(openKylin)或龙芯(LoongArch)处理器上运行,JCEF 没有经过这些平台的验证和优化。
Fuzio 原生支持信创生态:
| 信创平台 | 支持架构 |
|---|---|
| 银河麒麟 Kylin | x64 / ARM64 |
| 开放麒麟 openKylin | x64 / ARM64 |
| Loongnix | x64 / ARM64 / LoongArch64 |
Fuzio 提供 fuzio-linux64-loong 专用构件,一行依赖即可支持龙芯架构:
dependencies {
implementation("tech.fuzio:fuzio-linux64-loong:${fuzioVersion}")
}
对于政府、金融、能源等需要信创合规的行业,Fuzio 是目前国内唯一开箱即用的 Java 嵌入式 Chromium 方案。
获取帮助
JCEF 是一个开源项目。如果您需要帮助,可以在论坛上提问或在 bug 跟踪器中创建问题。如果您希望添加某个功能,可以贡献自己的力量。
Fuzio 是一款由即库科技(Jiku Technology)开发和提供技术支持的商业产品。当您联系我们的技术支持团队时,您将直接与负责该产品开发的工程师进行沟通。
| JCEF | Fuzio | |
|---|---|---|
| 支持语言 | 英文社区 | 中文 / 英文 |
| 沟通渠道 | 论坛 / Bug 跟踪器 | 工单系统 / 微信直接对接工程师 |
| 响应时区 | 无保障 | 中国时区(UTC+8) |
| SLA | 无 | 有 |
如果您发现了 bug,我们会迅速修复它,并尽快为您提供预览版本。如果缺少某个功能,我们会根据您的需求进行开发,并在后续版本中发布。
对于复杂场景和定制需求,我们可以提供高级服务。
更新与发布周期
Fuzio 大约每月发布一个新版本,并同步升级 Chromium。最新版本 Fuzio 2026.1.0 内置了 Chromium 147。我们会在 Chromium 官方发布稳定版本后的 3–4 周内完成升级,确保集成最新的安全补丁和漏洞修复。
每个版本都包含修复和功能改进,详细内容请参见我们的版本发布说明。
相比之下,JCEF 没有明确的发布模型,开发者需要自行选择要使用的具体提交版本。
总结
| 场景 | 推荐方案 |
|---|---|
| 开源或学术项目,预算有限 | JCEF |
| 商业软件,对稳定性和崩溃隔离有要求 | Fuzio |
| 需要适配信创平台(麒麟 / LoongArch) | Fuzio |
| 使用 JavaFX、SWT 或 Compose Desktop | Fuzio |
| 需要无头模式 / 离屏渲染 | Fuzio |
| 需要中文技术支持和 SLA | Fuzio |
| 需要 DevTools、网络拦截、Cookie 管理等高级功能 | Fuzio |
| 不想自行构建和维护 Chromium 二进制文件 | Fuzio |
联系我们
- 官网: jiku.co/fuzio/
- 免费试用: 获取试用许可证密钥