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

时间:2010-01-10 14:08:20

标签: java swt executable portability

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

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

5 个答案:

答案 0 :(得分:6)

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

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

步骤2.当你的引导类运行时,unjar自己的jar和它内部的所有jar都到了temp目录。使用下面的行来获得自己的罐子。

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

步骤3.您的引导类通过“os.name”属性检测操作系统,并使用此

从临时目录加载相应的jar
private static void loadJarIntoClassloader( URL u ) throws Exception
{
    URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();

    Class<URLClassLoader> 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是正确的,而对其他人来说则不然。

这样你只能提供一个罐子,它会解压缩并运行正确的罐子。

答案 1 :(得分:5)

答案 2 :(得分:1)

IIUC,您仍然遇到指定特定于平台的JNI库的问题。你可能可以利用Java Web Start来做这件事,但我还没试过。或者,某些项目为受支持的平台构建自定义安装程序。例如,Deploying SWT Applications on Mac OS X描述了如何构建SWT Mac应用程序包。该方法用于此example。我也看到过这个JarBundler Ant Task

附录:文章Deploying an SWT application on Java Webstart包含一些有用的参考资料。

答案 3 :(得分:0)

也许http://one-jar.sourceforge.net/http://code.google.com/p/onejar-maven-plugin/处的Maven插件)可以帮助朝这个方向发展......

答案 4 :(得分:0)

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