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

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

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

Ответы [ 5 ]

6 голосов
/ 11 января 2010

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

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

Шаг 2. Когда ваш класс начальной загрузки запускает, он разархивирует свой собственный jar и все 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<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, но не обязательно для других.

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

5 голосов
/ 23 июля 2010

Посмотрите на это, есть пример кода: Создание кроссплатформенного Java-приложения SWT

1 голос
/ 10 января 2010

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

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

0 голосов
/ 10 января 2010

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

0 голосов
/ 10 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...