Проблемы с загрузкой ресурсов во время выполнения

Вот предыстория основной проблемы. Я работаю с группой над проектом, который использует библиотеки Swt , и я пытаюсь упаковать программное обеспечение для развертывания. Оказывается, SWT очень зависит от платформы / архитектуры. Я хотел бы иметь возможность упаковать все шесть jar (linux, mac, win и 32/64-битные) в один и тот же пакет и использовать соответствующую библиотеку в зависимости от системы. Однако я понимаю, что это сложная задача, переход на Swing (или что-то еще) на самом деле не вариант прямо сейчас.

Я нашел несколько соответствующих тем ( @Aaron Дигулла s thread и @ mchr's thread ), которые предоставили мне ценную информацию относительно рассматриваемой проблемы. Я попытался реализовать решение, предложенное @Alexey Romanov здесь . С одним отличием, так как метод loadSwtJar () , который он предлагает, не является статическим, я создаю экземпляр объекта и сразу же после этого запускаю метод, прежде чем что-либо еще будет сделано с объектом.

Похоже, процедура загрузки работает неправильно. Я объясняю это утверждение следующим образом:

  • Если все jar-файлы 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. Очень признателен!

5
задан Community 23 May 2017 в 10:33
поделиться