Не удается найти файл .dylib после изменения `java.library.path`

Я создал файл .dylib, который хочу загрузить с помощью JNI, и не могу заставить программу Java найти его.

Я программно проверил значение java.library.path, и оно было таким:

/Users/potato/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.

Когда я поместил свой файл .dylib в одну из этих папок, моя программа Java обнаружила и без проблем загрузила файл .dylib, но когда я попытался изменить java.library.path, включив в него путь к папке на рабочем столе, и поместил файл .dylib на рабочий стол, программа не смог найти.

System.setProperty("java.library.path", "/Users/potato/Desktop:" + System.getProperty("java.library.path"));
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("winfnc");

output:
/Users/potato/Desktop:/Users/potato/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no winfnc in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)

Любая идея, что я делаю неправильно? Есть ли способ заставить программу найти файл .dylib в любой папке, которую я хочу, или еще лучше в своем собственном файле .jar и успешно загрузить его?

Обновлено: один ответ предлагает решение, использующее командную строку, но я хотел бы иметь возможность запускать приложение, дважды щелкнув исполняемый файл .jar, и не беспокоиться о каких-либо технических деталях.

В Eclipse есть возможность добавить аргументы виртуальной машины, но они используются только при запуске программы из Eclipse, а не при непосредственном открытии исполняемого файла .jar.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
268
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

java.library.path нельзя изменить изнутри программы. Вы можете установить это свойство, но его значение используется только при запуске ВМ и больше не считывается. Вы должны установить его с -D

Смотрите также мой ответ здесь: https://stackoverflow.com/a/51304696/2543253

Спасибо, консольная команда сработала. Однако я хочу отправить программу другим людям (не программистам), чтобы они могли легко использовать ее, не нуждаясь ни в чем, кроме исполняемого файла .jar. Есть ли способ добиться этого?

potato 22.01.2019 18:40

Насколько мне известно, нет никакого способа добиться этого с вашим существующим кодом, то есть с использованием loadLibrary. Вам нужно будет добавить собственный лаунчер или скрипт для запуска. Но если вы измените свой код, чтобы найти библиотеку самостоятельно с любой логикой, которую хотите, а затем используете load с полным путем к библиотеке вместо loadLibrary, вам не понадобится java.library.path.

user2543253 22.01.2019 19:00

Я уже думал о таких вещах, как повторный запуск приложения с Runtime.exec() и аргументами виртуальной машины, как только программа открывается, был слишком занят обдумыванием умных решений и пропустил самое простое, лол.

potato 22.01.2019 19:37

Другие вопросы по теме