Вот фон основной проблемы: я сотрудничаю с группой в проекте, который использует библиотеки Swt
, и я пытаюсь упаковать программное обеспечение для развертывания. Оказывается, SWT
очень зависит от платформы / архитектуры. Я хотел бы иметь возможность упаковать все шесть jar
(linux, mac, win и 32/64-bit) в один пакет и использовать соответствующую библиотеку в зависимости от системы. Я понимаю, что это сложная задача, однако переключение на Swing
(или что-то еще) на самом деле не вариант сейчас.
Я нашел несколько соответствующих тем ( @ нить Аарона Дигуллы и @ mchr ), которые предоставили мне ценную информацию о рассматриваемой проблеме. Я попытался реализовать решение, предложенное @Alexey Romanov здесь . С одним отличием, поскольку предлагаемый им метод loadSwtJar()
не является статичным, я создаю экземпляр объекта и сразу после этого запускаю метод, прежде чем что-либо еще будет сделано с объектом.
Похоже, что процедура загрузки не работает должным образом. Мое объяснение этому утверждению следующее:
- Если все jar-файлы
Swt
удалены из пути к классам исполняемого файла jar, выдается Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/events/MouseListener
, что вызвано: java.lang.ClassNotFoundException: org.eclipse.swt.events.MouseListener
для меня это означает, что библиотеки не найдены в classpath, я ошибаюсь?
- Если на пути к классам оставлено
swt
jar, то первый файл jar используется системой во время выполнения. Это означает, что если gtk-linux-x86_64 окажется первым jar-файлом swt в списке jar-файлов, то система попытается использовать его независимо от того, установлена ли на нем система win32 или Mac OSX.
Я попытался добавить некоторые выходные данные, чтобы увидеть, выбирает ли метод loadSwtJar()
правильный jar, и вывод выглядит правильным на всех платформах, которые я пробовал, так как выбран правильный пакет (и файлы существуют в бегущая банка). Но тем не менее правильная библиотека не загружена, поэтому возникают ошибки выполнения:
Exception in thread "main" java.lang.reflect.InvocationTargetException
вызвано, например: Caused by: java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
(Обратите внимание, что это ошибка, которая появляется на моем компьютере с Linux, если я изменяю порядок появления 64-битных и 32-битных библиотек SWT в файле build.xml
)
Итак, в чем здесь проблема? Я упускаю некоторые детали или просто невозможно проверить системные свойства и загрузить соответствующую библиотеку соответственно?
Наконец, ниже приводится выдержка из моего файла сборки, и я подумал, что это может помочь найти источник проблемы.
Заранее спасибо,
РЕДАКТИРОВАТЬ: После продолжительного сеанса отладки с коллегой проблема устранена (за исключением досадной ошибки, связанной с управлением потоками в MacOS, как я уже упоминал здесь ). Он включал в себя настройку сборки ANT, а также способ написания основного класса. (Как оказалось, основной класс расширял и реализовывал ссылки из библиотеки SWT, что означало, что код не будет компилироваться вообще, оборачивал основной класс другим классом и загружал оттуда файлы SWT, которых, по-видимому, было достаточно. для решения проблемы)
Спасибо и привет всем, кто внес свой вклад, особенно @Aaron. Очень ценю!