素来就比较喜欢SWT,因为和Swing比起来,和本地程序观感一致的SWT要更亲切些,而且性能上也更有优势,加上Eclipse的声势,SWT就更显得魅力无穷了。
不过,从Netbeans5.0发布以来,随着Netbeans的越加成熟以及Swing的性能提升,有关“Netbeans vs Eclipse”、“Swing vs SWT”之类的讨论,就变得更加激烈了。据说有不少开发团队都已经从Eclipse转向Netbeans了。
我好奇地试用了一下Netbeans,觉得比起当年的3.x来说,进步确实相当大。就速度来说,虽然不觉得快,但至少和Eclipse不相上下。虽然没有Eclipse那么大的声势,但Netbeans的插件阵营也在逐步丰富,俨然有后起直追之风。
无论如何,有竞争才会有进步,两个IDE在争斗,广大开发人员就有福啦!一家独大显然不会是太好的局面。
抛开IDE不谈,我倒是对SWT产生了些许厌烦:它的跨平台特性非常糟糕。我对SWT的性能并不太关注,也许Linux上的SWT确实并没有做什么优化,但至少它目前的性能和观感还是能令我满意的(和Swing相比的话)。
然而,SWT和平台的绑定实在太过紧密了!这造成了软件跨平台发布的问题。SWT软件在发布时,除了需要包括各种class文件和必要的资源文件之外,还必须包括SWT库:一个swt.jar,外加数量不等的链接库/共享库。这个庞大的swt.jar是平台相关的,也就是说每个平台都有自己的swt.jar文件。swt.jar甚至还是版本相关的,即使是同一个平台,还存在不同版本的swt.jar,它们各自都要求链接和各自版本号一致的链接库/共享库。
这种令人厌烦的事情让人想起当年发布VB软件时的情景。不过,许多电脑都根本没有预装SWT的运行时文件。除了大大增加了软件的发布大小之外,这种发布方式也使得Java“一次编译,到处运行”变成了传说,而真正成为了“一次编译,到处调试”。
我最近在尝试“移植”一个用SWT写的跳棋游戏,从Windows到Linux,再到Mac。我非常不愿意用“移植”这个词,因为这让我对Java的良好印象大打折扣。我原本的目标是对其进行改进,使其能在这三个系统上都可以直接运行,就像一般的Swing程序那样。
首先,我在Linux上无法运行该程序,意料之中。原程序(二进制版本)大小仅750K,Windows版本的SWT运行时文件共1.6M。在拷入了Linux版本的SWT运行时文件(共2.2M)之后,程序仍然无法运行,意料之中,当然是类路径的问题。
当我最终解决完这个问题之后并成功完成Linux版本的“移植”之后,我终于明白了,对于SWT程序来说,“一次编译,到处运行”几乎是不可能的。
首先就要把各种平台的运行时文件都带上,可以想象这个软件会变得有多庞大了。然后是设置类路径,由于需要跨平台,这居然成了个大问题:你得根据当前的平台来选择对应的swt.jar。所以,同样是Java程序,但“通用版”的SWT程序是不会有的了。
你只能为一个Java软件分别发布Windows版本、Linux版本、Mac版本,而为了保证这些版本都能正常工作,你还必须在各个平台进行测试,就像过去发布C++的项目一样。
也许有很多人不会介意这个问题吧,例如Eclipse。但是对于更多的人来说,需要发布及维护多个平台的版本,无疑是种十分无聊的工作:这可是Java程序。
我想,就算跟平台绑定是种折衷,至少也该提供个便于发布各种平台版本的SWT软件的工具吧?如果我可以
在Windows版本的Eclipse中选取“生成Linux平台的可执行Jar文件”,即使需要带上那2.2M的庞大运行时文件,我想我也可以暂且心安理得的接受了。