bit版本(bit version),是从国外一个论坛的帖子抄过来的,我原本也不清楚该怎样命名它,觉得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 上使用,这两种情况都会报类似"版本不兼容“的错误。我们的产品用到SWT,而客户环境的JDK可能会是32-bit或64-bit的,一般情况下,可以做个划分,比如产品也对应地分出两个版本,版本32-bit就只能安装在32-bit的JDK上,版本64-bit就只能安装在64-bit的JDK上,但这样不好,如果客户装了32-bit的之后发现不行,再重新安装64-bit的,换成是我,也会不爽的,所以要解决这个问题,让产品能够根据客户选择的JDK bit version来选用对应的SWT包。
研究了一下InatallAnywhere,发现可以对它做扩展。在这里,我写了一个扩展,在产品安装完之后,执行一个Action,检查客户所选择的JDK的bit version,再绑定对应bit version的SWT包。这种方法测试一段时间,发现可行性还挺好的,但之后又发现,如果客户不选择JDK,产品会到system32(此时是windows platform)时读取java.exe,这时,会导致该Action判断失误,所以这种方法不能完全解决问题。
接着考虑了一段时间,想出了一个不算太好的方法来做个“容错”处理。在产品安装完后的lib包有swt32.jar和swt64.jar两个包,默认使用的是swt32.jar,在产品启动的时候,new display时,用try-catch处理一下,如果有异常,则客户的JDK可能是64bit,这时就切换到swt64.jar,重新new display,继续执行其它操作,参考代码如下所示:
public static void main(String args[]) {
Launcher jcl = null;
try{
Display d = new Display();
Shell s = new Shell(d, SWT.SHELL_TRIM);
jcl = new Launcher(s, d);
}catch(Error e){
//出现问题了,进行容错处理
//默认是32 bit version
String now = "E:\\product\\jar\\swt32.jar";
String swt64 = "e:\\swt64.jar";
//这时用swt64.jar替换swt32.jar
doCopy(swt64, now);
//重新启动程序
Display d = new Display();
Shell s = new Shell(d, SWT.SHELL_TRIM);
jcl = new Launcher(s, d);
}
这种方法算是对前面Action的一个补充,在jar包切换的时候,只存在于产品首次启动,之后就不会再做判断或jar包切换了,当然,也会存在一些不好的地方,比如,swt包如果经常换来换去的,也是可能出问题的。暂时没找到更好的方法,先结合这两种方法,用一段时间看看。记录于此,以后找到更适用的解决方法再做修改。