Как разархивировать библиотеку во временный каталог, загрузить ее и все ее зависимости из этого каталога - PullRequest
0 голосов
/ 06 декабря 2011

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

  • libApp.so
  • libBasicPlugin.so => ​​libApp.so
  • libPlugin1.so => ​​libApp.so, libBasicPlugin.so, libPlugin2.so
  • libPlugin2.so => ​​libApp.so, libBasicPlugin.so

Java распаковывает их в произвольный уникальный временный каталог $ USER_HOME / .my-app / 2011_12_05_001 /, а затем загружает libApp.so, который, в свою очередь, использует dlopen для загрузки libPlugin1 и libPlugin2 (libBasicPlugin явно не загружается). Проблема в том, что libPlugin1 не знает, где найти libBasicPlugin и libPlugin2.

Вот различные решения, которые я пробовал / рассматривал:

  1. Помещение библиотек в известное место и установка LD_LIBRARY_PATH в файле sh перед вызовом Java. Это работает, но не позволяет упаковывать библиотеки в банку
  2. Использование Java System.load для «предварительной загрузки» зависимостей. Этот подход, который я видел, предложил, но, похоже, работает, только если вы априори знаете, какие плагины будут загружаться, и знаете их зависимости. Если вы не перебираете все файлы в каталоге, загружаете их, пока не перестанете получать UnsatisfiedLinkExceptions ...
  3. Каким-то образом сообщите общему объекту, что его зависимости будут находиться в одном каталоге (через DT_RPATH?). Это то, что, я думаю, мне бы хотелось в идеальном мире, но, похоже, лучшее, что вы можете сделать, - это установить местоположение библиотеки относительно исполняемого файла, который в данном случае /usr/lib/jvm/.../java.
  4. Статически связывать каждую библиотеку с ее зависимостями. Я боюсь, что это приведет к двум копиям libPlugin2 (динамическому и статическому), который в прошлом вызывал у нас все виды проблем.

В Windows вызов SetDllDirectory перед загрузкой плагинов решает эту проблему. Есть ли какие-то решения, которые я пропускаю / неправильно понимаю? Я иду по этому совершенно неправильному пути?

1 Ответ

0 голосов
/ 06 декабря 2011

Вы можете установить переменную LD_LIBRARY_PATH изнутри самого процесса Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...