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

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

[РЕДАКТИРОВАНИЕ] я думал для предоставления всех БАНОК платформы в подкаталоге и в main() затем изменил бы загрузчик класса. Кто-либо уже попробовал это?

12
задан Aaron Digulla 10 January 2010 в 14:08
поделиться

5 ответов

Посмотрите, там есть пример кода: Создание кроссплатформенного java swt приложения

5
ответ дан 2 December 2019 в 21:44
поделиться

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

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

1
ответ дан 2 December 2019 в 21:44
поделиться

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

Шаг 1. В манифесте «Главный класс» вы поместите свой класс Bootstrap

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

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});
}

Step 4. Теперь вы должны иметь возможность запускать свое приложение, вызывая приложение главный().

Примечание. Этот маленький взлом зависит от вашего JVM с использованием URLClasslase как его SystemClasslassLess, который верно для Sun JVMS, не наверняка на других.

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

6
ответ дан 2 December 2019 в 21:44
поделиться

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

0
ответ дан 2 December 2019 в 21:44
поделиться

Может быть, http://one-jar.sourceforge.net/ (плагин Maven в http://code.google.com/p/onejar- Maven-Plugin / ) может помочь в этом направлении ...

0
ответ дан 2 December 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: