浏览器运行 Java 的7种尖端技术!
myzbx 2025-01-04 21:49 24 浏览
大家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!
今天给大家带来的主题是如何使用浏览器来运行Java程序,话不多说,直接开始。
1.CheerpJ
1.1 什么是CheerpJ
CheerpJ是一种企业级解决方案,通过消除客户端对 Java 的依赖,实现对Java 应用程序和Java Applet的现代化访问。
目前,CheerpJ 可以将 Java 客户端应用转换为标准的 HTML5 / WebAssembly / JavaScript以便它可以在现代浏览器原生环境中运行,从而节省企业时间、金钱和资源。
CheerpJ包括以下核心组成部分:
- CheerpJ AOT 编译器:一个基于 LLVM 的 Java 字节码到 JavaScript 的编译器。 可用于将 Java (例如 .jar)或单个 .class 文件转换为 JavaScript。 目前支持: Linux、macOS 和 Windows。
- 运行时库:是 WebAssembly 和 JavaScript 中的完整 Java SE 运行时。
- 即时 Java-to-JavaScript 编译器:这是 CheerpJ 编译器的精简 JavaScript 版本,以启用 Java 的动态功能,例如反射。
1.2 为什么选择 CheerpJ?
CheerpJ 可以在浏览器上延长 Java 应用程序的生命周期,无需访问、更改其源代码。CheerpJ 的功能很强大,主要包括以下内容:
- 100% 转换 Java,包括反射、代理类。直接在 Java 字节码上工作,无需干预源代码。
- 带有完整的 Java SE 运行时,包括 Swing/AWT。 支持音频、打印和任何其他 Java SE 组件。 运行时支持 WebAssembly 以获得最佳性能。
- 生成的 JavaScript 代码经过高度优化、可进行高效垃圾回收。
- 支持双向 Java-JavaScript 互操作性。 可以从 Java 调用和操作 JavaScript 库以及 DOM。 可以从 JavaScript 调用转换后的 Java 模块。
- 支持 Java 多线程,允许使用 Web Workers 创建并发应用程序。
2.GWT
GWT 是一个开发工具包,用于构建和优化复杂的基于浏览器的应用程序。 它的目标是实现高性能 Web 应用程序的高效开发,而无需开发人员成为浏览器怪癖、XMLHttpRequest 和 JavaScript 方面的专家。 GWT开源并且完全免费,目前被全世界成千上万的开发者使用。
GWT 是一个开发工具包,用来构建大规模和高性能 Web 应用程序。GWT 用 JAVA 编写客户端应用程序, 然后将 JAVA 代码编译成 JS 代码。能够支持大部分的浏览器和操作系统,GWT是Google在前端工程化上的重要尝试。
GWT强调可重用的常见Web开发任务方法,即异步远程过程调用,历史管理,书签,UI抽象,国际化和跨浏览器可移植性。
GWT应用程序可以以两种模式运行:
- 开发模式:应用程序在Java虚拟机(JVM)中作为Java字节码运行。此模式通常用于开发,支持代码的热交换和调试。在2014年,开发人员模式的经典实现因浏览器更新而无法使用,直到用更兼容的超级开发模式取代,后者成为GWT 2.7中的默认模式。
- 生产模式:应用程序作为纯Java和HTML运行,从Java源代码编译。此模式通常用于部署。
3.TeaVM
3.1 什么是TeaVM
TeaVM 是 Java 字节码的预编译器,编译产物为在浏览器中运行的 JavaScript 和 WebAssembly。 它的近亲是众所周知的 GWT,GWT和TeaVM的主要区别是 TeaVM 不需要源代码,只需要编译的类文件。 而且不要求源代码是Java,所以TeaVM已经成功编译了Kotlin和Scala等其他语言。
TeaVM具有以下明显特征:
- 易于使用:从 Maven 原型创建一个新项目或应用 Gradle 插件就可以愉快地开发,而无需使用 npm、Webpack、UglifyJS、Babel 等进行复杂的设置。
- 高效:TeaVM 非常高效,编译时时间很快。此外,TeaVM 为快速启动的 Web 应用程序生成快速、小型的 JavaScript 代码,即使在移动设备上也是如此。
3.2 为什么需要TeaVM
TeaVM 主要是一个网络开发工具, 它不是为了使用 Java 或 Kotlin 现有的大型代码库来生成 JavaScript。 不幸的是,Java 并不是为在浏览器中高效运行而设计的。 如果不生成低效的 JavaScript,有些 Java API 是无法实现的。 比如一些 API :反射、资源、类加载器和 JNI。 TeaVM 限制这些 API 的使用。 通常,开发者必须手动重写代码以适应 TeaVM 约束。
TeaVM 适合以下开发者:
- 一名 Java 开发人员,从头开始编写 Web 前端。
- 已经拥有基于 Java 的后端,并希望将前端代码紧密集成到现有的开发基础架构中。
- 您有一些要在前端重用的 Java 后端代码。
- 您已准备好重写代码以使用 TeaVM。
如果您有使用 Swing 的紧耦合应用程序,希望在 Web 中运行这些应用程序,并且不关心下载大小、启动时间和性能,此时可以考虑使用 CheerpJ而不是TeaVM。
4.Jsweet
JSweet通过使用JavaScript库和框架,利用TypeScript在Java中编写丰富且响应迅速的Web应用程序。使用JSweet,可以将Java程序被转换成TypeScript和JavaScript。
比如官网的描述:
JSweet:A transpiler to write JavaScript programs in Java
JSweet具有以下明显特点:
- JSweet快速、轻量:生成的代码是常规JavaScript代码,可以直接与现有JavaScript程序和库进行交互操作。
- 安全可靠:JSweet为web应用程序提供类型检测,并生成完整的类型检测程序。它基于Oracle的Java编译器(javac)和Microsoft's TypeScript(tsc)。同时JSweet允许开发者自由选择JS库。
- 代码共享:JSweet支持服务端Java和客户端JavaScript代码共享。
比如下面的Java程序:
package org.jsweet;
import static jsweet.dom.Globals.*;
/**
* This is a very simple example that just shows an alert.
*/
public class HelloWorld {
public static void main(String[] args) {
alert("Hi there!");
}
}
使用JSweet会生成以下TypeScript程序:
namespace org.jsweet {
/**
* This is a very simple example that just shows an alert.
*/
export class HelloWorld {
public static main(args : string[]) {
alert("Hi there!");
}
}
}
org.jsweet.HelloWorld.main(null);
最终输出的JavaScript代码如下:
var org;
(function (org) {
var jsweet;
(function (jsweet) {
/**
* This is a very simple example that just shows an alert.
*/
var HelloWorld = (function () {
function HelloWorld() {
}
HelloWorld.main = function (args) {
alert("Hi there!");
};
return HelloWorld;
}());
jsweet.HelloWorld = HelloWorld;
})(jsweet = org.jsweet || (org.jsweet = {}));
})(org || (org = {}));
org.jsweet.HelloWorld.main(null);
5.Vaadin Flow
Vaadin Flow 使用 Java 来构建现代 Web 应用程序。 Vaadin Flow 是一个独特的全栈框架,让开发者无需编写 HTML 或 JavaScript 即可构建 Web 应用程序。Vaadin Flow具有以下明显特点。
构建 Web 应用程序的更简单方法
使用全堆栈 Java 框架 Vaadin Flow,开发者无需考虑请求、响应和其他底层Web 开发概念。与构建传统桌面应用程序非常相似,开发者可以从组件组成 UI,将其连接到数据源并对用户事件做出反应。 UI 在 JVM 上运行,无需公开 REST 服务或想出其他方法将数据移动到浏览器。
应用程序在浏览器中呈现为标准 HTML,它们适用于所有现代浏览器和设备,无需插件。
@Route("hello-world")
public class HelloWorld extends VerticalLayout {
public HelloWorld() {
TextField name = new TextField("Name");
Paragraph greeting = new Paragraph("");
Button button = new Button("Greet", event -> {
greeting.setText("Hello " + name.getValue());
});
add(name, button, greeting);
}
}
集成UI 组件
Vaadin 带有大量漂亮的 UI 组件,例如表单输入、对话框、数据网格和可视化。 开发者可以直接在 Java 代码中扩展组件和创建组合。 一切都建立在开放的网络标准之上,并可以在所有现代主流浏览器上运行。
支持实时协作
Collaboration Engine 提供的功能使您的用户能够直接在应用程序内实时协同工作。 仅需几行代码,即可显示活跃用户、实现聊天并允许多人在同一视图上工作。
自动化用户界面测试
使用 Vaadin TestBench 实现自动化 UI 测试。模拟用户测试允许开发者在用户之前发现所有主要浏览器的任何回归或兼容性问题。
可视化UI构建
使用 Vaadin Designer 更快地构建 UI。拖放功能和外部设备预览功能使开发者能够快速组装可用于 Flow 应用程序的 HTML 模板。
6.J2CL
J2CL 是一个功能强大、简单且轻量级的从 Java 到 Closure 风格的JavaScript 的转换器。
J2CL 充分利用 Java 和 JavaScript, 开发者不再需要在两者之间做出选择或锁定特定的框架或语言。J2CL具有以下明显特点:
- 及早错误捕捉: 基于强大的 Java 类型系统的强大的运行时类型检查与高级跨语言类型检查相结合,可以及早发现您的错误。
- 提供大量代码重用: J2CL 严格遵循 Java 语言语义,实现了跨不同平台的重用,支持将最流行的 Java 库引入工具包,包括 Guava、Dagger 和 AutoValue。
- 现代、速度极快: 在 Bazel 的支持下,J2CL 提供了一种快速而现代的开发体验,让开发者保持高效。
- 安全生产部署: J2CL 是谷歌开发的最先进的 GSuite 应用程序的底层技术,包括 GMail、Inbox、Docs、Slides 和 Calendar等等。
Closure Compiler :是一种使 JavaScript 下载和运行速度更快的工具。 它是一个真正的 JavaScript 编译器。 它不是从源语言编译为机器代码,而是从 JavaScript 编译为更好的 JavaScript。 它解析 JavaScript,对其进行分析,删除死代码、重写并最小化剩余的代码。 它还会检查语法、变量引用和类型,并对常见的 JavaScript 陷阱发出警告。
7.JWebAssembly
JWebAssembly 是 WebAssembly 编译器的 Java 字节码。 它使用 Java 类文件作为输入。 可以编译任何可编译为 Java 字节码的语言,如 Clojure、Groovy、JRuby、Jython、Kotlin 和 Scala。
JWebAssembly的编译输出为二进制格式(.wasm 文件)或文本格式(.wat 文件),其本质是使用 WebAssembly 在浏览器中本地运行 Java。
与类似项目的不同之处在于,不应移植具有 GC 和内存管理功能的完整 VM。 这更像是 1:1 的转换。 生成的 WebAssembly 代码在大小上与原始 Java 类文件相似。
比如下面的例子,要导出 Java 函数以使其可从 JavaScript 访问,开发者必须添加注释 de.inetsoftware.jwebassembly.api.annotation.Export。
import de.inetsoftware.jwebassembly.api.annotation.Export;
@Export
public static int add( int a, int b ) {
return a + b;
}
8.本文总结
本文主要和大家介绍浏览器运行 Java 的5种尖端技术,包括:CheerpJ 、GWT 、TeaVM 、Jsweet 、Vaadin Flow 、J2CL 、JWebAssembly等等。同时,笔者已经成功将CheerpJ用于线上生产项目中,并完成线上部署。因为篇幅有限,文章并没有就每一个方案过多展开,如果有兴趣,可以直接在我主页继续阅读单框架介绍,但是文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!
参考资料
http://teavm.org/docs/intro/overview.html
https://blog.csdn.net/terrychinaz/article/details/117398107
https://www.gwtproject.org/doc/latest/DevGuide.html
https://github.com/cincheo/jsweet
https://vaadin.com/flow
https://github.com/google/closure-compiler
https://www.infoq.cn/article/dLh3evH5zl7bzj0N11Vh
https://github.com/i-net-software/JWebAssembly
https://github.com/google/j2cl
相关推荐
- 零基础入门AI智能体:详细了解什么是变量类型、JSON结构、Markdown格式
-
当品牌跳出固有框架,以跨界联动、场景创新叩击年轻群体的兴趣点,一场关于如何在迭代中保持鲜活的探索正在展开,既藏着破圈的巧思,也映照着与新一代对话的密码。在创建AI智能体时,我们会调用插件或大模型,而在...
- C# 13模式匹配:递归模式与属性模式在真实代码中的性能影响分析
-
C#13对模式匹配的增强让复杂数据处理代码更简洁,但递归模式与属性模式的性能差异一直是开发者关注的焦点。在实际项目中,选择合适的模式不仅影响代码可读性,还可能导致执行效率的显著差异。本文结合真实测试...
- 零基础快速入门 VBA 系列 6 —— 常用对象(工作簿、工作表和区域)
-
上一节,我介绍了VBA内置函数以及如何自动打字和自动保存文件。这一节,我们来了解一下Excel常用对象。Excel常用对象Excel有很多对象,其中最常用也最重要的包括以下3个:1.Workbo...
- 不同生命数字的生肖龙!准到雷普!
-
属龙的人总在自信爆棚和自讨苦吃之间反复横跳?看完这届龙宝宝的日常我悟了。属龙的人好像天生自带矛盾体:领导力超强可人缘时好时坏,工作雷厉风行却总在爱情里翻车。关键年份的龙性格差异更大——76年龙靠谱但不...
- 仓颉编程语言基础-面向对象编程-属性(Properties)
-
属性是仓颉颉中一种强大的机制,它允许你封装对类(或接口interface、结构体struct、枚举enum、扩展extend)内部状态的访问。它看起来像一个普通的成员变量(字段),但在其背后,它通过...
- Python中class对象/属性/方法/继承/多态/魔法方法详解
-
一、基础入门:认识类和对象1.类和对象的概念在Python中,类(class)是一种抽象的概念,用于定义对象的属性和行为,而对象(也称为实例)则是类的具体表现。比如,“汽车”可以是一个类,它有...
- VBA基础入门:搞清楚对象、属性和方法就成功了一半
-
如果你刚接触VBA(VisualBasicforApplications),可能会被“对象”“属性”“方法”这些术语搞得一头雾水。但事实上,这三个概念是VBA编程的基石。只要理解它们之间的关系,...
- P.O类型文推荐|年度编推合集(一百九十五篇)
-
点击左上方关注获取更多精彩推文目录2019年度编推35篇(1V1)《悖论》作者:流苏.txt(1V1)《桂花蒸》作者:大姑娘浪.txt(1V1)《豪门浪女》作者:奚行.txt...
- Python参数传递内存大揭秘:可变对象 vs 不可变对象
-
90%的Python程序员不知道,函数参数传递中可变对象的修改竟会导致意想不到的副作用!一、参数传递的本质:对象引用传递在Python中,所有参数传递都是对象引用的传递。这意味着函数调用时传递的不是对...
- JS 开发者必看!TC39 2025 最新动向,这些新语法要火?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。TC39第...
- 2025 年值得尝试的 5 个被低估的 JavaScript 库
-
这些JavaScript库可能不会在社交媒体或HackerNews上流行起来,但它们会显著提高您的工作效率和代码质量。JavaScript不再只是框架。虽然React、Vue和Sv...
- Python自动化办公应用学习笔记30—函数的参数
-
一、函数的参数1.形参:o定义:在函数定义时,声明在函数名后面括号中的变量。o作用:它们是函数内部的占位符变量,用于接收函数被调用时传入的实际值。o生命周期:在函数被调用时创建,在函数执...
- 16种MBTI人格全解析|测完我沉默了三秒:原来我是这样的人?
-
MBTI性格测试火了这么久,你还不知道自己是哪一型?有人拿它当社交话题,有人拿它分析老板性格,还有人干脆当成择偶参考表。不废话,今天我一次性给你整理全部16种MBTI人格类型!看完你不仅能知道自己是谁...
- JS基础与高级应用: 性能优化
-
在现代Web开发中,性能优化已成为前端工程师必须掌握的核心技能之一。本文从URL输入到页面加载完成的全过程出发,深入分析了HTTP协议的演进、域名解析、代码层面性能优化以及编译与渲染的最佳实践。通过节...
- 爱思创CSP-J/S初赛模拟赛线上开赛!助力冲入2024年CSP-J/S复赛!
-
CSP-J/S组初赛模拟赛爱思创,专注信奥教育19年,2022年CSP-J/S组赛事指定考点,特邀NOIP教练,开启全真实CSP-J/S组线上初赛模拟大赛!一、比赛对象:2024年备考CSP-J/S初...
- 一周热门
- 最近发表
-
- 零基础入门AI智能体:详细了解什么是变量类型、JSON结构、Markdown格式
- C# 13模式匹配:递归模式与属性模式在真实代码中的性能影响分析
- 零基础快速入门 VBA 系列 6 —— 常用对象(工作簿、工作表和区域)
- 不同生命数字的生肖龙!准到雷普!
- 仓颉编程语言基础-面向对象编程-属性(Properties)
- Python中class对象/属性/方法/继承/多态/魔法方法详解
- VBA基础入门:搞清楚对象、属性和方法就成功了一半
- P.O类型文推荐|年度编推合集(一百九十五篇)
- Python参数传递内存大揭秘:可变对象 vs 不可变对象
- JS 开发者必看!TC39 2025 最新动向,这些新语法要火?
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)