Java, загрузить собственную библиотеку внутри пути к классам

У меня следующая раздача

.__bin
|   |__start.sh
|
|__lib
    |__Main.jar
    |__Utility.jar
    |__lib.so

Main.jar содержит основной метод, в котором я хотел бы получить доступ к собственным функциям, предоставляемым lib.so, включенным в дистрибутив. start.sh просто устанавливает путь к классам и загрузку java.

Как лучше всего загрузить библиотеку lib.so внутри приложения? Мне известны два метода:

  • System.load (абсолютный путь)
  • System.loadLibrary (имя)

Прежний требует абсолютного пути к библиотеке в файловой системе, последний требует установки аргумента JVM java.library.path для конкретного приложения. Какое решение лучше в этом случае? Может ли установка пути к библиотеке в сценарии start.sh что-нибудь сломать? Как я могу получить абсолютный путь к файловой системе библиотеки для первого решения?

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

Ответы 2

Предполагая, что я ничего не упускаю, разве установка System.load не является лучшим подходом? Ваш lib.so не изменится, поскольку он у вас есть в вашей структуре. Если вы хотите предоставить конечному пользователю возможность загружать родную / общую библиотеку из другого места, укажите в start.sh необязательный параметр. В противном случае используйте System.load (). Просто не забудьте проверить тип ОС, так как у вас будут разные форматы для путей к файлам.

Метод load() требует в качестве аргумента полный путь к библиотеке. Например, в системе Solaris вы можете написать:

System.load("/home/me/libs/libmylib.so");

для загрузки библиотеки libmylib.so в каталог /home/me/libs.

Использование метода load() зависит от системы, поскольку он использует pathname для загрузки библиотеки, а пути обычно зависят от системы. Таким образом, loadLibrary() иногда оказывается лучшим выбором. Однако динамически загружаемые библиотеки зависят от системы по своей природе, поэтому использование load() не может поставить под угрозу системную независимость не больше, чем процесс загрузки самой библиотеки.

Метод loadLibrary() требует для загрузки только имени a:

System.loadLibrary("mylib");

Метод loadLibrary() выполняет поиск библиотеки. Поиск, выполняемый loadLibrary(), зависит от системы, в которой вы работаете, но обычно он ищет каталоги, перечисленные в одной из переменных вашей среды, настроенных для этой цели.

Вы можете явно указать свой абсолютный путь.

Помимо системной независимости, с точки зрения безопасности нет никаких реальных различий.

использованная литература:

1) https://security.stackexchange.com/questions/35724/security-implications-of-javas-system-load-vs-system-loadlibrary

2) https://www.chilkatsoft.com/java-loadLibrary-Linux.asp

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

Похожие вопросы