SWT跨平台的4个绑定
1、跟JVM bit-version绑定太死。
SWT bit version有32-bit和64-bit两种,同样,jdk也有32-bit和64-bit两种。经过多次测试,发现32-bit SWT只能安装在32-bit JDK 上,而64-bit SWT也只能安装在 64-bit JDK上,两都不能交叉使用,即32-bit SWT 不能在 64-bit JDK 上使用, 64-bit SWT 不能在 32-bit JDK 上使用,这两种情况都会报类似"版本不兼容“的错误。这个可能不算大问题,但也会消耗你的人日,我在其它两篇文章也提到这个问题。
Installanywhere:当64位swt遇上32位JVM
处理SWT bit版本与JDK bit版本的对应
2、跟操作系统绑定太死。
SWT是通过C语言调用系统底层,实现其界面效果。这样,对应不同的操作系统,就有使用不同的SWT包,Eclipse官网上也给出了这些包以及对应的操作系统,比如eclipse3.7的:http://download.eclipse.org/eclipse/downloads/drops/R-3.7.2-201202080800/index.php#SWT
但实际上,你会发现,这个跨平台功能实际上没那么强大,特别是Linux平台的。你会发现,某个SWT包标明是可以运行在Linux平台的,但Linux平台包容众多平台,如Suse、RedHat、Ubuntu、Centos等,相同的SWT包,有可能在这些平台上,运行效果不一样,有些包根本都不能兼容该平台的。别说SWT,就是Eclipse也会出现这问题。比如,我在测试时,发现,Eclise3.5 Linux版本的不能在Redhat6服务器版本安装,Eclise3.6就可以,安装3.5时没问题,就是运行时,无法远行,也没有报错、日志之类的查看。但无论是3.5还是3.6,都可以在Ubuntu上安装。
3、跟浏览器绑定太死。
SWT里面有一个组件Browser,能够调用系统安装的浏览器来显示HTML文件或是打开URL链接。查看该组件源码,会发现该组件的实现过程,对要调用的浏览器做了很多类似判断,个人感觉,这些判断有点HardCode,容错处理也有点不全面,排错不方便。在Windows平台是好好的,但换到Linux平台,特别是要支持多个Linux平台,这时问题就来了。如:
[java]
Exception in thread "main" org.eclipse.swt.SWTError: No more handles [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)]
at org.eclipse.swt.SWT.error(SWT.java:4308)
at org.eclipse.swt.browser.Mozilla.initMozilla(Mozilla.java:1826)
at org.eclipse.swt.browser.Mozilla.create(Mozilla.java:687)
at org.eclipse.swt.browser.Browser.<init>(Browser.java:99)
[java]
[java]
Exception 2: after update xulrunner
[java]
org.eclipse.swt.SWTError: XPCOM error -2147467259
at org.eclipse.swt.browser.Mozilla.error(Mozilla.java:2089)
at org.eclipse.swt.browser.Mozilla.create(Mozilla.java:458)
at org.eclipse.swt.browser.Browser.<init>(Browser.java:119)
at com.ibm.team.apt.internal.ide.ui.editor.WikiFormPage2.createBrowser(WikiFormPage2.java:816)
虽然Eclipse官网上提供了FAQ,但你会发现这些根本不够用。SWTFAQ
浏览器问题很容易让你陷入新的技术,如xulrunner。我还没找到有新方案能够代替Browser组件的,这个Browser真不好。 www.zzzyk.com
4、不同平台,实现存在差异。这个不列举了,在实现过程,多对比,会发现一些差异的。
以上是个人使用SWT遇到的一些问题,有错误之处,欢迎指正。我觉得,用SWT来开发跨平台的产品,还是要谨慎考虑。
补充:软件开发 , Java ,