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用到了JavaFX,Epple介绍说:
Epple补充说,在两大主流移动平台上,DukeScript的工作方式类似,不过使用的虚拟机和WebView不同:
在桌面浏览器上,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注解,如下面的例子所示: @Model(className="Person", properties={ @Property(name = "firstName", type=String.class), @Property(name = "lastName", type=String.class) @Property(name = "addresses", type=Address.class, array = true) }) 通过HTTP或WebSocket,HTML/Java API使用JSON与服务器通信,这里用到了另一个注解——@OnReceive。关于这一点,Tulach写到:
HTML/Java API在设计时力求做到尽可能简单,不依赖其他库,而且可以在不同的JVM上执行,包括HotSpot和Bck2Brwsr。 Epple还扩展了HTML/Java库,添加了一个HTML5 Canvas API,以及一个基于JavaFX Canvas API的游戏引擎。 DukeScript的网站列出了一些例子,其中包括一个简单的HTML-Java在线编辑器,这个编辑器还有一个Angular.js To-Do Demo。 |