SWT带有一个基础JAR和每个平台(Windows,Linux/32位,Linux/64位,Mac,AIX等)的一个特定JAR。如何创建一个可执行的JAR文件,在运行时选择正确的平台JAR?
[编辑] 我想提供所有平台JAR在一个子目录中,并在main()
中修改类加载器。有没有人已经尝试过这样做?
SWT带有一个基础JAR和每个平台(Windows,Linux/32位,Linux/64位,Mac,AIX等)的一个特定JAR。如何创建一个可执行的JAR文件,在运行时选择正确的平台JAR?
[编辑] 我想提供所有平台JAR在一个子目录中,并在main()
中修改类加载器。有没有人已经尝试过这样做?
为了我的现职,我需要提供一个可执行的jar文件,它可以在自身内部加载jar文件并执行第二个main()方法。基本上是有一个引导main()方法和一个应用程序main()方法。
步骤1:在清单“main-class”中放置引导类。
步骤2:当你的引导类运行时,它会将自己的jar文件及其内部所有jar文件解压到一个临时目录中。使用以下类似的代码来获取你自己的jar文件。
Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()
第三步。您的引导类通过“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});
}
第四步。现在,您应该能够通过调用应用程序的main()函数来运行应用程序。
注意:这个小技巧取决于您的JVM是否使用URLClassLoader作为其SystemClassLoader,在Sun JVM中是正确的,但其他JVM可能不一定如此。
这样,您可以只交付一个单独的jar文件,它将自动解压并使用正确的jar文件运行。
newInstance(urls, parentClassLoader)
方法进行包装,然后使用 Thread.currentThread().setContextClassLoader()
安装新的类加载器。 - Aaron Digulla据我所知,您仍然需要解决指定特定平台的JNI库的问题。您可以尝试利用Java Web Start来解决这个问题,但我还没有尝试过。另外,一些项目会为支持的平台构建自定义安装程序。例如,在Mac OS X上部署SWT应用程序描述了如何构建SWT Mac应用程序包的方法。该方法在此示例中使用。我也看到过使用JarBundler Ant Task 的情况。
补充说明:文章在Java Webstart上部署SWT应用程序包括一些有用的参考资料。
也许 http://one-jar.sourceforge.net/(Maven插件在http://code.google.com/p/onejar-maven-plugin/)可以帮助实现这个方向...
对于不同的平台,使用不同的shell脚本,并在脚本中指定特定于平台的jar包将更加容易。