不同平台的SWT jar包

7

我在一个Swing应用程序中使用JWebBrowser。此类属于DJ项目。它需要执行swt jar。现在,我已经将Windows的swt jar包含到了应用程序的jar包中。我想知道如何在同一包装中包含Linux/Mac的swt jars?我正在使用Ant构建应用程序jar。我应该为不同的平台构建不同的swt jar并把它们放到jar中吗?


一个Jar文件或Java文件应该是跨平台的。你说swt.jar对于每个平台都是独特的。我认为这违背了Java平台无关性的整个意义,这是Java的强大之处。 - bragboy
@Bragboy:说得好;总的来说,[tag:java-web-start] 可以缓解这个问题。 - trashgod
可能是重复的问题:创建跨平台Java SWT应用程序 - Alexey Romanov
3个回答

11

如果你想要一个可以在不同平台(Win/Mac/Linux/*nix)或架构(32/64位)上运行的单一构建,则可以将每个目标平台的SWT jar捆绑到安装程序中,然后在运行时动态加载正确的jar文件(或者在安装时让安装程序复制正确的SWT jar文件)。

例如,假设你想要支持32位和64位的Windows和Linux操作系统,则需要有以下SWT jar文件:

lib/swt_win_32.jar
lib/swt_win_64.jar
lib/swt_linux_32.jar
lib/swt_linux_32.jar

在你的Ant脚本/安装程序中包含所有这些文件(它们每个约为1.6MB),然后在运行时,在你的代码中使用Java系统属性来检测操作系统和架构

System.getProperty("os.name");
System.getProperty("os.arch");

构建正确的jar文件名称。

可以通过自定义类加载器或使用反射调用受保护方法URLClassloader.addURL(URL url)来在运行时加载jar。

我已经将执行此任务的工作代码放在我的网站上:http://www.chrisnewland.com/select-correct-swt-jar-for-your-os-and-jvm-at-runtime-191

如果你能忍受代码气味,那么这是一个解决常见SWT问题的快速解决方案。


1
这种方法的问题在于它取决于代码运行的JVM。在64位机器上,您可以运行32位JVM,并且它将报告32位。当您尝试加载32个swt jar时,您将收到一个InvocationTargetException,因为您尝试在64位机器上加载32位swt。只有当您的JVM与计算机匹配(即在32位计算机上使用32位JVM)时,才能正常工作。我使用了您链接中的代码,并且在用户在64位机器上运行32位JVM时出现了问题。仍在努力解决。 - javydreamercsw

2
在Mac OS +X上,您可以将所需的JAR和JNI库合并到应用程序包中,如此项目所示。另请参阅在Mac OS X上部署SWT应用程序
在Linux上,大多数平台都提供swt-gtk软件包。以下是AppleCommander的启动脚本的具体示例:
java -Djava.library.path=/usr/lib/jni \
    -cp /usr/lib/java/swt-gtk-3.5.1.jar:AppleCommander-1.3.5.8.jar \
    com.webcodepro.applecommander.ui.AppleCommander -swt

1
问题可以通过按照这里所描述的方法来解决。 - Tapas Bose

1

这个答案包含了选择正确的SWT JAR文件来启动应用程序的代码:创建跨平台Java SWT应用程序

你只需要把所有的JAR文件放在正确的文件夹中,代码就会自动识别它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接