Как я могу создать исполняемый JAR с SWT, который работает на всех платформах?

SWT поставляется с базовым JAR и одним конкретным JAR на платформу (Windows, Linux/32bit, Linux/64bit, Mac, AIX,...). Как создать исполняемый JAR, который выберет правильный JAR платформы во время выполнения?

[EDIT] Я подумывал предоставить все платформы JAR в подкаталоге, а в main() - модифицировать загрузчик классов. Кто-нибудь уже пробовал это?

Ответ 2

Для моего текущего задания мне нужно было предоставить исполняемую банку, которая могла бы загружать банки внутри себя и выполнять второй main(). В основном, bootstrap main() и приложение main().

Шаг 1. в манифесте "основной класс" вы помещаете свой класс начальной загрузки

Шаг 2. Когда запускается класс bootstrap, он разбивает свою банку и все банки внутри нее на временную директорию. Используйте что-то вроде строки ниже, чтобы получить свою собственную банку.

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

Шаг 3. Класс bootstrap обнаруживает ОС через свойство "os.name" и загружает соответствующие банки из каталога temp с помощью этого

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().

ПРИМЕЧАНИЕ. Этот небольшой взлом зависит от вашей JVM, используя URLClassLoader как ее SystemClassLoader, что верно для Sun JVM, но не обязательно для других.

Таким образом вы можете доставить только одну банку, и она распакуется и будет работать с правильными банками.

Ответ 3

IIUC, вам все равно придется задавать конкретную библиотеку JNI для конкретной платформы. Вы можете использовать Java Web Start для этого, но я не пробовал. В качестве альтернативы, некоторые проекты создают пользовательские установщики для поддерживаемых платформ. Например, Развертывание приложений SWT в Mac OS X описывает, как создать пакет приложений SWT Mac. Этот подход используется в примере . Я также видел эту JarBundler Ant Задача.

Приложение: статья Развертывание SWT-приложения на Java Webstart содержит некоторые полезные ссылки.

Ответ 5

Будет проще использовать разные сценарии оболочки для разных платформ и указать конкретную платформу jar в script.