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