如何使用在所有平台上运行的SWT创建可执行JAR?

SWT每个平台都有一个基础JAR和一个特定的JAR(Windows,Linux / 32位,Linux / 64位,Mac,AIX,…)。 如何创建可在运行时选择正确平台JAR的可执行JAR?

[编辑]我想在子目录中提供所有平台JAR,然后在main()修改类加载器。 有没有人试过这个?

看看这个,有一个代码示例: 创建跨平台的java swt应用程序

对于我目前的工作,我需要提供一个可执行jar,它可以在其自身内加载jar并执行第二个main()。 基本上是一个bootstrap main()和一个应用程序main()。

步骤1.在清单“main-class”中放入引导类

第2步。当你的bootstrap类运行时,unjar是自己的jar,里面的所有jar都是temp目录。 使用类似下面的行来获得自己的jar。

 Main.class.getProtectionDomain().getCodeSource().getLocation().toURI() 

步骤3.您的引导类通过“os.name”属性检测操作系统,并使用此属性从临时目录加载相应的jar

 private static void loadJarIntoClassloader( URL u ) throws Exception { URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class sysclass = URLClassLoader.class; Method method = sysclass.getDeclaredMethod("addURL", URL.class); method.setAccessible(true); method.invoke(sysLoader, new Object[]{u}); } 

步骤4.现在,您应该可以通过调用应用程序main()来运行应用程序。

注意:这个小小的hack取决于你的JVM使用URLClassLoader作为它的SystemClassLoader,这对于Sun JVM是正确的,而在其他方面则不然。

这样你就可以只交付一个jar子了,它会解压缩并运行正确的jar子。

IIUC,您仍然有指定特定于平台的JNI库的问题。 您可以为此利用Java Web Start ,但我还没有尝试过。 或者,某些项目为受支持的平台构建自定义安装程序。 例如, 在Mac OS X上部署SWT应用程序描述了如何构建SWT Mac应用程序包。 该示例中使用了该方法。 我也看过这个JarBundler Ant Task

附录: 在Java Webstart上部署SWT应用程序一文包含一些有用的参考。

也许http://one-jar.sourceforge.net/(http://code.google.com/p/onejar-maven-plugin/上的 Maven插件)可以帮助实现这个目标……

为不同的平台使用不同的shell脚本会更容易,并在脚本中指定特定于平台的jar。