级别: 初级 Elliotte Rusty Harold (elharo@metalab.unc.edu), 副教授, Polytechnic University
2007 年 6 月 18 日 今年的 JavaOne 开发者大会十分成功,参会者编写了代码、讨论了语言扩展、实验了跳舞机器人,而且还举杯畅饮。回顾此次会议,Elliotte Rusty Harold 发现 JavaFX Script 以及其他一些客户端的创新技术成为了亮点。通过本文,让我们来看看在未来一年 Sun 在客户端方面的重新投资对于基于 Java ™ 的富 Internet 应用程序开发将意味着什么?
上个月,一年一度的 JavaOne 开发者大会成功举办,这已经是 Sun Microsystems 第十二次举办这个 Java 开发者盛会。自 1996 年该讨论会作为 Software Development West 的一个无足轻重的副产品问世以来,现在它已经发展成为规模最大的开发者盛会了。大约有 10,000 到 15,000 的参会者花上一个星期的时间来聆听其同行或同事在诸多主题方面的演讲,比如 Scala、REST、Java Enterprise Edition (JEE)、rich Internet applications (RIA)、robotics、Swing、Blu-ray 等等。
总的来看,此次会议传达了这样一个信息:服务器端已经发展至巅峰,至少在 Java 平台上如此。JEE 以及相关技术,比如 Hibernate、Spring 和 servlet 都已经是落日黄花。当然,现在开发人员还在使用它们,但就目前而言,它们已经被归于遗留代码的范畴了。会上对基于 Java 的服务器端技术介绍不多,亦无大的新闻出现,更甚者,主题演讲根本就没有这方面的内容。相反,关注服务器端的 Java 开发人员大都将重点放到了 Ruby、Rails 和 REST for salvation(从这个意义上讲,可以将他们称为之前的 Java 开发人员)。
毋庸置疑,在 Java 领域,关注点又回到了客户端。很多演讲者,大多数来自 Sun,展示了诸多在 Java 2D、Swing、AJAX 和 GUI 构建器方面的最新进展和成果,且大受与会者的关注和青睐。接下来,我将在这个报告中对 JavaOne 2007 的一些亮点做简单的回顾和讨论。
会议的焦点:JavaFX Script
 |
没有太大的意外
坦率地讲,JavaFX Script 并没有什么意外之举:它在会上所展示的东西与包括我在内的开发人员预期的几乎丝毫不差。如果知道从何处寻找,甚至能在 JavaOne 的目录中找到它,隐藏在其代码名 F3 之下。Rich Green 真是不及 Steve Jobs 能给人带来意外惊喜。 |
|
今年 JavaOne 的一个重大宣布是 Chris Oliver 的
JavaFX Script,它是编写类似 Flash 的富 Internet 应用程序的一种声明式语言。JavaFX Script 利用了 Java 2D 来创建非标准的小部件,比如燃烧的火焰、旋转的色彩轮和以您喜爱的明星的头部为原型定制的特色按钮。
清单 1 所示的是一个用 JavaFX Script 编写的简单的应用程序,它让一个红色的射线绕蓝色的圆圈旋转,图 1 显示了运行中的应用程序。
清单 1. 用 JavaFX Script 编写的一个简单的应用程序
import javafx.ui.*;
import javafx.ui.canvas.*;
Frame {
title: "JavaFX Whirl"
width: 200
height: 225
var rot = [0..360] dur 36000 linear
content: Canvas {
content: [Circle {
cx: 100
cy: 100
radius: 100
fill: blue
}, Line {
transform: bind [rotate(rot, 100, 100)]
x1: 100
y1: 100
x2: 100
y2: 0
stroke: red
strokeWidth: 3
}]
}
visible: true
} |
图 1. 一个 JavaFX Script 应用程序
有经验的 Web 开发人员都会注意到图 1 中的应用程序实际上是 Scalable Vector Graphics (SVG) 和 Apple 的 canvas 元素的缩影。主要的区别在于 SVG 和 canvas 依赖于程序性 JavaScript 来定义行为,而在 JavaFX Script 中,行为是声明性的。
一些明显的挑战和困难
JavaFX Script 呈现全部是用 Swing 和 Java 2D 实现的,这会带来很多问题。第一个问题是 Java 平台的速度是否快到可以处理富 Internet 应用程序。基于 Java 的 GUI 性能总的来说都很慢,其中尤其以 Java 2D 应用程序最为突出。虽然 Java 平台较之前在数学运算和服务器类型的运算方面都快了许多,但客户端仍然是症结所在。Sun 希望在不久的将来能够通过默认开启 DirectX 和 OpenGL 图形加速功能来解决这一问题,而且,它还计划将图形加速应用到大多数 Java 2D 运算而不仅仅是现在已经加速的基本操作。这些变更应该能为具有足够图形卡的现代硬件带来可接受的性能。
此外,JavaFX Script 现由 Java 虚拟机(virtual
machine,VM)在运行时负责解释,但是这也很容易更改。Sun 最近雇用了 Per Bothner 来负责字节-代码编译器方面的开发,一旦开发完成,将极大地改进 JavaFX Script 应用程序的性能。
第二个问题是 JavaFX Script 是否能完成 Swing 所不能实现的功能。很不幸,答案是不能。JavaFX Script 实质上只是能编译进 Java 字节代码的另一种语言。然而,JavaFX Script 比典型的 Java 代码更具声明性和更易编写,至少对其所针对的富 Internet 应用程序开发是这样的。
每人可能都会产生这样的疑问,即 JavaFX Script 是否能代替或至少能够挑战 Flash。我认为答案是否定的。Java 语言一直 都能实现 Flash 所有的功能。只不过编写的时间会比较长。一个资深的 Flash 专业人士创建一个 applet 只需花三小时,而同样的工作如果用 Java 语言完成则要花上三星期的时间。JavaFX Script 缩短了二者之间的这种差距,所以现在 Java 程序员只需三天的时间就可以做出 Flash 专业人士三个小时做出来的东西。虽然提高了很多,但还远远不够。
真正的问题是工具:Sun 没有任何工具。JavaFX Script 是在像 jEdit、vi 和 NetBeans 这样的文本编辑器中手写的。现在 Sun 还没有能与
Adobe Flash 开发环境抗衡的对等产品。试图围绕 Flash 重建 Web 的艺术学校毕业的人或多或少都会发现 JavaFX Script 并没有比 Java 代码更容易使用。那些曾更偏向使用 JavaFX Script 的人现都也都已经在编写直白的 Java 代码了,只不过既能即担当程序员又能胜任富客户端设计师的人为数不多。只有到 Sun 综合其所有工具并推出 Flash 的真正的竞争者之时,JavaFX Script 才能真正流行。
部署的解决方案
除了创建之外,部署是用 Java 代码编写的富 Internet 应用程序的另一个典型问题。一些主要的客户应用程序,比如 LimeWire,都与过时的 Java Runtime Environment (JRE) 紧密地联合在一起,原因是他们不希望招来捆绑更大更新的 VM 的麻烦。今年 JavaOne 会议的很多分会都谈到了解决部署问题的现有的一些努力。Ethan Nicholas 更是大谈 “轻松部署终于到来了”,虽然下这种断言还有些为时过早,但他所介绍的许多建议解决方案(如下所示)应该在明年的早些时候有望在 Java 7 中与我们见面。更为深入实质的一些更改甚至可以在对 Java 6 的更新中发布。
重新设计安装程序
步骤 1 是就连您的父母都能在没有帮助的情况下使用的安装程序。当前的安装程序都很难用和复杂,而且在多半情况下都不能按预期的工作。他们只适用于开发人员。下一个 JRE 安装程序将会被简化并面向终端用户。
Sun 也在致力于改进 ActiveX 控件、插件和 JavaScript 程序以便能让浏览器可以检查 Java VM 是否已经安装,如果已经安装,安装的是哪个版本。新的开发工具箱可以更易于在用户没有安装或没有安装正确版本时提示用户安装 Java VM。部署工具箱目前只适用于 Windows® 操作系统,但可以在 Firefox 或 Internet Explorer® 上工作。
对于 Mac,Sun 还在依赖于 Apple 来将 Java VM 附加到每个售出的 Mac 上。起先,这种做法还算不错,直到 Sun 开始宣扬一些愚蠢的言辞,比如 “现在是转换到 Java 6 的时候了”(这种说法在整个会议中被很多 Sun 的员工重复了多遍)。Apple 可能到今年秋天都不会拥有 Java 6 VM,而且大多数 Macs 在未来的几年内都不会升级。
JRE 在 Linux® 上的情形要稍好一些。Sun 原则上支持 Linux,但既然现在 JDK 也在 GPL 之下,所以以客户端为中心的发行版,比如 Ubuntu,可以开始捆绑 JRE。(会议上很多膝上型电脑都运行的是 Ubuntu 。它显然成为了桌面发布版的一种选择。)到明年这个时候,用户根本不用下载 JRE 再将其安装到
Linux,它应该已经在 Linux 中预置了。
加快冷启动
步骤 2 是减少 VM 启动时间,尤其是用于 applet 的时间。如果我们真的关注用户,那么浏览器第一次遇到 applet 所发生的 10 秒的暂停时间就应该视为是拒绝服务攻击。当浏览器一启动,Sun 就应该能加载 VM,但这可能会占用平时不怎么使用的大量内存,相反,Sun 现正准备将 .class 文件预加载进磁盘缓存。这将不会像启动虚拟机那样占用 RAM 或 CPU,但若 VM 是首次加载,那么它的确可以让启动加快。此技术有望在今年晚些时候或明年的早些时候出现。
对于独立的应用程序,甚至还可以更进一步。类文件验证和即时编译可以在此应用程序运行之前或者此应用程序第一次之时就完成。验证和编译好的代码可以存储。后续运行也可由实际编译的本地代码立即启动,而无需停下来先进行验证和编译。
缩减 JRE
步骤 3 是缩减 JRE 并允许为定制应用程序定制 VM。现在已经有进行中的工作在力图生成一种小型(比如 4MB)的基本发布,该发布可以智能到能够运行 “Hello World” 和动态下载它所需要的任何内容。让我们正视这样的事实:谁还会需要 org.omg.CORBA 和 javax.imageio 呢?第三方开发人员将能创建虚拟机,这些虚拟机可以只捆绑应用程序所需的类。对于很多应用程序而言,定制 VM 可将所需的内存减少到一半或更少。
从 JAR 到 JAM 的转换
最后的步骤 4 是消除类路径的麻烦。正如 Stanley M.
Ho 和 Michal Cierniak 所介绍的,Java 7 将会引入一种新的 JAR 格式,称为
Java Archive Module (JAM)。一个 JAM 文件就是一个 JAR 文件(这个 JAR 文件本身只不过是带不同扩展名和一些元数据的 ZIP
文件),但它包含了额外的元数据并允许 JAR 的嵌套。即,一个 JAM 文件可以包含一个或更多的 JAR 归档文件。因此就能将应用程序所需的所有的类都捆绑到一个文件中。此外,额外的元数据还能允许类不仅能在其他 JAR 上声明依赖项,还能在其他 JAR 的特定版本上声明。如果应用程序使用的是 Xerces-J 2.6.1,在 2.6.2,它就会遇到细微的 bug,这时,可以显式要求使用 2.6.1。最后,存储所有不同的 JAR 需要用到存储库。可以有单独的全局、自引导、应用程序、本地甚至是网络的存储库(似乎与我的观点有些冲突)。jre/lib/ext 应该清空。
上述这些特性单独看来作用不大,但若将它们放在一起,作用就可以叠加。结果是终端用户的 Java 客户端体验会有显而易见的小型改进。
更简单的 Swing 开发
部署的改进会有利于终端用户,但那些辛苦的客户端开发人员又该如何呢?Sun 并没有为他们提供很多解决方案,但有几个改进还是很明显的。
Swing 应用程序框架
到目前为止,Swing 只具有定义好的单独组件,可以提供用于按钮、窗口、菜单等的类。由开发人员负责将它们组合起来组成一个应用程序,但这个过程会比较单调。
由 Joshua Marinacci 和 Hans
Muller 展示的 Swing 应用程序框架将现有的组件,例如 JFrame 和
JMenu,整合到一个可由定制代码扩展的完整(如果是最小限度)的应用程序。图 2 显示了用 Swing 应用程序框架构建的应用程序。最需要注意的一点是您可以通过在向导中填写几个类名、选择目录和单击按钮来创建这样的应用程序。这可以节省很多工作。
图
2. 使用 Swing 应用程序框架构建的简单应用程序
目前,Swing 应用程序框架还只支持单窗口应用程序,但多窗口的应用程序也将会在未来添加。
当使用框架时,您只是在应用程序生命周期的某个点(比如启动和关机)将自己的代码插入进来。当然,您也可以向组件附加动作。此外,框架还让创建异步和模式动作变得更为容易。在
Swing 中阻塞事件分配线程的危险众人皆知,但仍然有很多程序员在这一点出错。Swing 应用程序框架旨在更轻松地做好正确的事情。
Matisse 如何呢?
要定制基于 Swing 的 GUI,Sun 建议使用 Matisse GUI Builder。
Matisse 让您可以将组件拖放到窗口并图形化地设置其属性。对比在原始源代码中进行组织和安排,这种方式更容易使用(尤其是对于布局)。使用 Matisse 的缺点是它会使 GUI 代码中充满类似如下所示的注释:
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor. |
这是一个主要的设计漏洞。所生成的代码应该被放置于单独的一个文件且不能和应用程序代码混淆。此外,选择使用
Matisse 会让您必须使用 NetBeans 作为 IDE。可以将这些代码放入其他的 IDE,比如 Eclipse,但如果日后要想将其放回到 NetBeans,Matisse 就会无所适从。这对于单个的开发人员或者是独立的团队来说可能不算什么,但对于开源团队项目而言却是个大问题,在这样的团队中,不同的开发人员使用不同的工具。
总的来说,Matisse 看起来都像是前途光明的一种尝试和努力,但目前来讲,它还不能用在主要场合。
Filthy Rich Client
当然,如果您除了工作之外的时间十分充裕(这就如同猴子可以学会说话并开始引用莎士比亚的十四行诗一样不大可能),那么您就可以使用原始代码和一个文本编辑器来自己独立构建 GUI。Romain Guy 和 Chet Haase 展示了 Filthy Rich Client 并实际执行了
Extreme GUI Makeover,给出了一个示例,说明了 Swing 应用程序不一定非要像灰箱里的灰箱。基本上,它们都是在直白的 Java 代码中实现的(包括几个特定于 Java Native Access 的技巧),正如 Chris Oliver
用 JavaFX Script 实现的一样。这种方式让人印象深刻,但却超出了我的技能范围。
Filthy Rich Client 方式和 JavaFX Script 方式所共同拥有的特征之一是大量设计工作都是用 Photoshop 完成的。在屏幕中显示的实际上大部分都是能呈现 Photoshop 中所绘制的图像的定制 Swing 组件
。如果您有在 Photoshop 中设计 GUI 小部件所需的技能,那么这个技巧将十分有趣。因此,对于 Kai Krause 和 Romain Guy 而言,这真的非常酷,但对于我们大多数人来说都不得不在未来的一段时间内继续忍受灰箱设计,除非我们有能力雇用具有图形设计技能的人士来弥补我们这些程序员在此方面的不足。
如在 Java 代码中一样自由
JavaOne 另一个已经不是新闻的重大突破是 Sun 终于肯向开源打开大门。在星期二开幕式的主题演讲中,Rich Green 发布了 GPL 下完整的 JDK。但事情并非完全如此。据称由于 现存的许可和法律方面的阻碍,一些零碎的组成部分还只能以二进制插件的形式实现。虽然大多数 JDK 现已都是开源的,只有 4% 不是,尤其以以下六个方面最为突出。
- 图形光栅化程序
- 字体光栅化程序
- 颜色选择器
- 声音 API 的某些部分
- SNMP
- 加密类的一小部分
前五个条目都涉及了第三方的代码。Sun 没有给出所涉及的第三方的具体名称;但无论他们是谁,结果都是一样的,即他们都拒绝将其代码在 GPL 之下发布。字体光栅化程序可能还会涉及到专利问题。Sun 一直希望社区在不久的将来能够贡献出这些条目的无阻碍的替代物。
加密类则是个单独的问题。Sun 声称发布一个未经加密处理的版本会存在一些法律方面的限制。我并不是一个律师,我对此持怀疑态度。Sun 自其成立之初就一直与军事机构有着合作,所以若想测试究竟有哪些限制,显然不大可能。虽然对比其他五个项目而言,加密是容易解决和替换的(很多工作都已经由第三方的项目,比如 Bouncy Castle 完成了),但 Sun 还是不太可能会同意发布其代码。越过这个障碍所需要的恐怕就只有一种真心诚意的态度了。
展望未来,单独的 OpenJDK 项目和产品将会出现,它们至少在理论上是独立于 Sun 的。Sun 将让其正式的 JDK 建立于 OpenJDK 产品之上,但二者也有一些不同之处。由 Simon Phipps、Dalibor Topic、Mark Reinhold、Doug Lea 和 Fabian
Nardon 还组成了一个初始的领导小组。他们负责编写章程并有权组织选举下一届小组的成员。看起来还挺像回事的。
很多语言建议
到目前为止,已经有众多会议都提出了诸多语言建议,比如闭包、具体化泛型、类型推断等等。这些主题在此次会议也备受关注,成了人们茶余饭后的谈资。
我还不能排除我内心会下意识过滤掉并不认同的谈话,但我深刻地感受到设计下一个 Java 语言版本的开发人员与使用该语言的开发人员之间所存在的一种日益严重的断层。会上,Sun
的发言人一直在反复号召我们使用 Java 6,但实际上,很多与会者在去年才刚刚转换到 Java 1.4,而且大多数人也刚刚开始了解 Java 5。Java 6 还没有在他们的考虑范围之内。
若进一步去看,与会者大都对与过去决裂和清除 Java 库热情高涨,即使是牺牲一些向后兼容性也在所不惜。相反,Sun 的发言人却在不断强调不惜一切代价追求向后兼容性。
而对于该语言中的新特性,大多数与会者都不温不火,甚至闭包这样的原本令人兴奋的主题也都风光不再。Java
语言不能满足人们的需求,其程度已经让大多数与会者都更倾向于学习一种全新的语言,比如 Scala,而不愿意再向 Java 语言中添加新的特性。对他们来说颇为幸运的是,据 Neal Gafter 预测,Java 7 中不会再有新的语言特性。闭包和其他一些类似的主要更改都将等到 Java 8 再添加。
在这方面,Ruby 和 Scala 成了最大的赢家。至少在这一点上,Sun 和 Java 世界的其余部分还算同步。Sun 正在加强对虚拟机中以及其 NetBeans IDE 中动态类型脚本语言的支持。似乎,有关将 NetBeans 用于
Ruby 和 Rails 开发的谈论要较 Java 开发多许多。TextMate 总算是有了来自 Rails 社区的真正的竞争对手。
舞动的机器人和其他有趣的小点缀
JavaOne 如果没有一些有趣的小点缀就称不上 JavaOne 了。Sun 曾一度大力宣传 RoboSapiens,它们是一些骇人的恐龙和具有人的特点的机器人,在去年的圣诞节深受孩子们的欢迎。很显然,每一个 RoboSapiens 都包括一个 Java 虚拟机。刚出厂的机器人中的这个 VM 是锁定的,不能使用。然而,在本次会议的展览中,有几个带未锁定的 VM 的可编程机器人在展售。而且还举行了一个非正式的比赛,看看谁能使机器人做出最为有趣的事情。在开幕式的主题演讲中,曾提议让获胜者在星期五上台表演,但最后我们看到的却是一个预先录制好的机器人跳舞的演示,而且跳得还不怎么样。
展会现场比赛的问题是真正参加 JavaOne 的人根本就没有时间来认真参与。除了参加会议或展览之外的所剩不多的时间也都花在了排队等候进入会议或吃午饭上了。闲暇时间着实不多。这个问题在 Virtual Flying Dukes 比赛中也很明显。比赛要求开发人员使用 jMonkey Engine (jME) 构建三维的具有魔法的天神来捕获从虚拟的大炮中发射的虚拟的 T 恤衫(这远没有去年的非虚拟的大炮和弹弓的比赛有趣)。
虽然一等奖的奖励高达 $5000 美元,但参加者仍为数不多。大多数与会者都觉得,要是有一两天的没有任何干扰的专项时间,取胜并不难。自然,没有干扰的时间真非这次 JavaOne 会议所能给您的。除了主题演讲时段(尤其是展览中间的令人厌烦的公司演讲)之外,大多时间都会有至少三个或更多有趣的事情在同时进行。
就小点缀而言,此次展览真正的焦点并非机器人,不管是虚拟的还是真实的,都是如此。真正的热点是 Sun SPOT,它是 一款小型的可编程传感器,可运行 Java 2
Micro Edition CLDC 作为其本地语言和操作系统。它包括一个温度传感器和一个加速器,所以您就可以判断这个 spot 会向哪个方向移动,且以多快的速度移动。您可以通过 USB 或以无线方式连接到它。它可以控制其他设备,比如机器人和门。它的价格现在有些不菲(每个 $200 多美元),但如果定购量很大,价格有望降低。展会上展示了很多很棒的 Sun SPOT 项目,还有更多这样的项目很受人们关注,在走廊里常常能听到相关的谈论。总的来说,对比玩具机器人或另一个虚拟世界而言,Sun SPOT 看起来都更为有用并且限制更少。
结束语
今年的 JavaOne 是我一段时间以来所参加的最为令人疲惫不堪的大型会议。会议于早上 8:30 就开始,而常常会接近午夜才结束。(明年,我一定要选择一家距离更近一些的酒店。)但会议之所以这么晚才结束也是有原因的:围绕 Java 平台和相关技术所发生的有趣事情太多,而 JavaOne 又是所有这些的焦点所在。
没有人能够对这个展会一览无余,我也不例外。这些有趣的东西,我了解到的不过一半,而真正能参与其中的也就不足四分之一。我曾真的很想将更多的时间花在 BoFs、RedMonk Unconference、JavaME 和 TV 频道,以及更深入的 Ruby 上,而只简单浏览一下展览就可以了,但一天不过 24 小时,而并行进行的事情常常就有 24 种之多。有时,我真觉得 JavaOne 就像是多线程程序的一个现场展示。
基于本次展览判断,Java 平台仍一如既往地强大且还在不断发展之中。除了其跨平台的好处之外,Java
平台曾经在相当长的一段时间内都是一个非常封闭的 “生态系统”。本次展会所要展示的就是这种状况正在改变。该平台已经对新的社区开放而且也使用了新的用例。GPL 许可最终会让其受到 Linux 开发的重视,而且还可能会使得社区中断对 C 和 Mono 的使用。同样重要的是,Java 虚拟机现在也对脚本语言(比如 Ruby、Groovy 和 Scala)开放了。这将让其进入了新的问题领域,这里曾经是诸如 Python 和 Perl 这类语言的王国。最后要看到,JavaFX Script 至少是向富 Internet 应用程序领域迈出的试探性的一步,这个领域最初由 Java 平台起步,但最近却在 Flash 和 Ajax 的统治之下。如果 Sun 在五年前就这么做了,Flash 恐怕就是当今 Web 世界中一个微不足道的玩家了。
对于那些一直觉得客户端要比另一个数据库后端要有趣的人来说,Sun 最终回归客户端真是个振奋人心的消息。Java 平台的 “势力范围” 比先前更为扩大,前景真是一片光明。
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | Elliotte Rusty Harold 原籍新奥尔良,现在,他还定期回老家喝一碗美味的秋葵汤。不过目前,他和妻子 Beth 定居在纽约临近布鲁克林的 Prospect Heights,同住的还有他的猫咪 Charm(取自夸克)和 Marjorie(取自他岳母的名字)。他是 Polytechnic 大学的计算机科学副教授,讲授 Java 和面向对象编程。他的 Cafe au Lait Web 站点是 Internet 上最受欢迎的独立 Java 站点之一,其姊妹站点 Cafe con Leche 是最受欢迎的 XML 站点之一。他的下一部著作 Refactoring HTML 会在今年的晚些时候由 Addison Wesley 出版。他目前从事用于处理 XML 的 XOM API 和 Jaxen XPath 引擎的研究。 |
对本文的评价
|