Проблемы с загрузкой ресурсов во время исполнения
Вот фон основной проблемы, я сотрудничаю с группой над проектом, который используетSwt
библиотеки, и я пытаюсь упаковать программное обеспечение для развертывания. Как выясняетсяSWT
очень зависит от платформы / архитектуры. Я хотел бы иметь возможность упаковать все шестьjar
s (linux, mac, win и 32/64-bit) в один и тот же пакет и использовать соответствующую библиотеку в зависимости от системы. Я понимаю, что это сложная задача, переходя наSwing
(или что-нибудь еще) на самом деле не вариант сейчас.
Я нашел ряд соответствующих тем (@ Нить Аарона Дигуллы а также@ mchr тема), которая дала мне ценную информацию о проблеме под рукой. Я попытался реализовать решение, предложенное @Alexey RomanovВот, С одним отличием, какloadSwtJar()
метод, который он предлагает, не является статичным, я создаю экземпляр объекта и сразу после этого запускаю метод, прежде чем что-либо еще будет сделано с объектом.
Похоже, что процедура загрузки не работает должным образом. Мое обоснование этого утверждения заключается в следующем:
Я упалSwt
jar удаляются из пути к классам исполняемого файла 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, и вывод кажется правильным на всех платформах, которые я пробовал, поскольку в правильном пакете выбран (и файлы действительно существуют в работающем 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. Очень ценится!