写点什么

DukeScript:随处运行 Java 的新尝试

  • 2014-11-26
  • 本文字数:2783 字

    阅读完需:约 9 分钟

Jaroslav Tulach 是 NetBeans 的创始人和最初的架构师, Anton (Toni) Epple 则是一位 Java 咨询师和培训师,最近他们凭借 DukeScript 获得了 2014 年的 Duke 选择奖。DukeScript 这门技术希望能将 Java 带到一切客户端、移动终端或桌面,而不需要借助插件。DukeScript 这个名字有些误导性,其实它并不是一门新的脚本语言,相反它只是尝试“将 Java 放到 JavaScript 之中”,进而实现 Java 最初的愿景——“一次编写,到处运行”。

DukeScript 是这样一门技术,它支持使用 Java 和 HTML5 创建跨平台的移动和桌面应用。不同于其他将 Java 应用于服务器端的解决方案,DukeScript 将 Java 应用到了客户端,而且不依赖 Oracle 过去用于运行 Applet 的插件。该技术可以运行于 Android、iOS、桌面浏览器以及任何 HTML5/JavaScript 环境中。

Epple 向 InfoQ 解释了 DukeScript 及相关技术是如何工作的:

一个 DukeScript 应用的基本架构其实非常简单,包括 3 个组件:一个是 Java 虚拟机,一个是 HTML 渲染组件,再就是 DukeScript。DukeScript 将 JVM 和 HTML 组件粘合到一起,作为运行在虚拟机中的业务逻辑和用 HTML/JavaScript 编写的 UI 之间的桥梁。

DukeScript 应用运行在 JVM 中,使用 HTML 渲染器显示页面。当页面加载时,DukeScript 会在内部通过 Knockout.js,将该页面的动态元素绑定到数据模型。它与典型的 Knockout.js 应用的差别在于,数据模型由 Java 对象组成,用户可以在 Java 代码中操控这些对象。利用这种方式,业务逻辑可以完全用 Java 编写,与 UI 清晰地分离开来。

在我们支持的每一个平台上,都要找到一个 JVM 和一个 WebView 组件,并将其衔接到一起。显而易见,真正的困难在于通信,因为每个平台都略有不同。

该技术支持多种场景。在桌面上,可以脱离浏览器,此时 DukeScript 用到了 JavaFX,Epple 介绍说:

在桌面上,我们有 Hotspot VM 和 JavaFX WebView,而且后者可以直接与 Java 交互。这也很方便调试应用。当运行在 HotSpot 上时,我们可以使用断点、表达式求值以及 IDE 提供的所有其他优秀功能来调试应用。在 WebView 中,NetBeans 可以检查 DOM 树,显示 CSS,我们可以在应用运行时动态更新页面的 HTML。

Epple 补充说,在两大主流移动平台上,DukeScript 的工作方式类似,不过使用的虚拟机和 WebView 不同:

在 Android 上,有 Dalvik 作为虚拟机,android.webkit.WebView 用于渲染 HTML 和执行 JavaScript。在 iOS 上,有 RoboVM(一款通过 LLVM 流水线生成机器代码的 AOT 编译器)和 NSObject.UIResponder.UiView.UIWebView。通过连接这些基本组件,我们可以在这些不同的平台上运行同样的应用。

在桌面浏览器上,Java 代码需要翻译为相应的 JavaScript 片段。这可以通过 Bck2Brwsr (Tulach 编写的一款 JVM)提前编译或即时编译。据 Epple 介绍,对于 JIT 场景,当 Web 页面加载时,Bck2Brwsr 会被加载进来,再由它来加载应用中的 Java 主类并实例化,之后是实例化 Java 数据模型,并实现与 HTML 组件的绑定。当 Java 代码执行时,Bck2Brwsr 将其翻译为 JavaScript,并在浏览器的引擎中运行。Bck2Brwsr 并不是必须的,可以用其他虚拟机替代,比如可以使用 TeaVM

在 Windows Phone 上,可以使用与 Android 和 iOS 类似的解决方案,以 Bck2Brwsr 作为所选的 JVM,但是目前尚未测试,或许还需要更多工作。

据 Tulach 介绍,Bck2Brwsr 目前有些不足:它没有使用反射,而且“该项目的目标并非来执行现有的任何 Java 库”。它面向的是新的、需要特殊设计的受限环境。Tulach 想在以后增加很多改进,并希望得到社区的帮助:

该框架的另一个重要组件是 HTML APIs via Java 1.0 API (HTML/Java),这是一组用于和 HTML 页面交互的 Java API,最初是为 NetBeans 开发的。默认情况下,该 API 可以通过 JavaFX WebView 在桌面浏览器上与 HTML 交互。该 API 已经与 Knockout 做了集成,后者会提供与数据模型的绑定,所以不需要直接操作 DOM。Tulach 提到,该 API 也可以配合 Controls.js 使用,还可以添加对其他框架的支持(比如 Angular.js 等)。

HTML/Java API 可以用于从 Java 中直接调用 JavaScript,而反向的调用可以借助 JavaScriptBody 注解实现。下列代码片段就是一个例子:

复制代码
@JavaScriptBody(args = {"x", "y"}, body = "return x + y;")
private static native int sum(int x, int y);

为简化针对浏览器编写的 Java 代码,并避免“冗长的 JavaBeans 模式”,Tulach 使用了 Model 注解,如下面的例子所示

复制代码
<a href="http://bits.netbeans.org/html+java/1.0/net/java/html/json/Model.html">@Model</a>(className="Person", properties={
<a href="http://bits.netbeans.org/html+java/1.0/net/java/html/json/Property.html">@Property</a>(name = "firstName", type=String.<b>class</b>),
<a href="http://bits.netbeans.org/html+java/1.0/net/java/html/json/Property.html">@Property</a>(name = "lastName", type=String.<b>class</b>)
<a href="http://bits.netbeans.org/html+java/1.0/net/java/html/json/Property.html">@Property</a>(name = "addresses", type=Address.<b>class</b>, array = <b>true</b>)
})

通过 HTTP 或 WebSocket,HTML/Java API 使用 JSON 与服务器通信,这里用到了另一个注解—— @OnReceive 。关于这一点,Tulach 写到:

它会再生成一些样板化代码,因此与服务器的数据交互就只是几行代码的事了。事实上,如果比较原始的 JavaScript 示例代码的大小,就会发现这正是新的 HTML/Java API 所擅长的。用于异步 REST 或 WebSocket 通信的 Java 代码要比对应的 JavaScript 代码短。

HTML/Java API 在设计时力求做到尽可能简单,不依赖其他库,而且可以在不同的 JVM 上执行,包括 HotSpot 和 Bck2Brwsr。

Epple 还扩展了 HTML/Java 库,添加了一个 HTML5 Canvas API ,以及一个基于 JavaFX Canvas API 的游戏引擎

DukeScript 的网站列出了一些例子,其中包括一个简单的 HTML-Java 在线编辑器,这个编辑器还有一个 Angular.js To-Do Demo

关于作者

Abel Avram从 2008 年起,在 InfoQ 参与了很多编辑工作,喜欢撰写移动、HTML、.NET、云计算和企业级架构等主题相关的新闻报道。如果您有兴趣提交新闻或者有价值的文章,可以通过邮件 abel [at] infoq.com 联系他。

查看英文原文: DukeScript: A New Attempt to Run Java Everywhere

2014-11-26 07:265820
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 138.0 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

Java程序员面临的竞争太激烈了,如何破局?

了不起的程序猿

程序员 后端 java面试 Java八股文

3款AI iPhone应用年收入超过1000万美元的故事

陆通

三面滴滴失败,总结了Java面试题,有几个题还是一直搞不懂

Summer

Java 程序员 面试 架构师 大厂

Java并发编程为什么这么难学?

了不起的程序猿

Java 后端 架构师 java面试 Java并发编程

面试官:如果要存ip地址,用什么数据类型比较好

架构师之道

编程 java面试

2025版Java架构师面试指南,涵盖Java所有核心技能

了不起的程序猿

后端 高并发 架构师 java面试 Java八股文

好家伙!这份2025最新SpringBoot进阶笔记涵盖了其所有骚操作

了不起的程序猿

spring 后端 springboot java程序员 java面试

数据平台产品经理入门手册-合集

数据小吏

大数据平台 #数据产品经理

LED显示屏能耗与运营成本解析

Dylan

经济 LED显示屏 全彩LED显示屏 技术 优化体系

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 标准版和厂商定制版,已适配主流品牌服务器

sysin

esxi

周亚辉投资笔记:机器人时代的社会结构模型与十年后中国首富预测

脑极体

AI

大模型推理GPT | DeepSeek | Doubao

AIGC.TWang

AIGC GPT 豆包 DeepSeek

2025年Java面试(1200+面试题附答案解析)

架构师之道

编程 java面试

具身智能陪伴机器人赛道,迎来一波融资潮和创业潮!

机器人头条

机器人 科技 人形机器人 具身智能

金三银四跳槽涨薪Java面试题!568页真题+答案解析,大厂都在考

Summer

Java 程序员 面试 架构师 大厂

2025-01-04:不包含相邻元素的子序列的最大和。用go语言,给定一个整数数组 nums 和一个由二维数组 queries 组成的查询列表,其中每个查询的格式为 queries[i] = [pos

福大大架构师每日一题

福大大架构师每日一题

小小的我,大大的AI

脑极体

AI

为什么Java面试背八股是当下招聘不可逆的形式?

了不起的程序猿

程序员 后端 架构师 java面试 Java八股文

记录懒猫微服使用

玄兴梦影

私有云 NAS 云电脑 #NUC 懒猫微服

【技术深度】CSP_WHITELIST:精细化控制Web安全的新策略

风雪中漫步

Easysearch Java SDK 2.0.x 使用指南(三)

极限实验室

sdk client easysearch

虾皮店铺商品API接口的开发、运用与收益

科普小能手

数据挖掘 数据分析 跨境电商 API接口 虾皮API接口

《计算机组成及汇编语言原理》阅读笔记:p200-p240

codists

Java 计算机组成及汇编语言原理

阿里工作10年,我总结出了这份1071页Spring全家桶核心笔记

了不起的程序猿

spring 后端 架构师 java程序员 java面试

为什么Java面试不会微服务很难找到工作?

了不起的程序猿

程序员 微服务 架构师 SpringCloud java面试

SpringBoot 实现动态插拔的 AOP,就变得有趣多了

采菊东篱下

编程 java面试

Java程序员如何更好的上手Java性能优化?

了不起的程序猿

程序员 性能优化 后端 java面试 java架构师

吃透这份2025最新Java性能优化小册后,我让公司系统性能提升了200%

了不起的程序猿

程序员 后端 架构师 java面试 Java性能优化

真的离谱,Java初中级面试也要问高并发问题

了不起的程序猿

程序员 后端 架构师 java面试 Java并发编程

PyTorch中运行时间的测量与对比

王玉川

gpu 性能优化 算子 测量

2025年社招高质量Java八股文面试最全攻略

采菊东篱下

编程 计算机 java面试

DukeScript:随处运行Java的新尝试_Java_Abel Avram_InfoQ精选文章