Загрузите DLL (использующий JNA) в пакете OSGi

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

6
задан Mark Elliot 4 September 2009 в 17:31
поделиться

3 ответа

Проблема заключается в специализированном вызове JNA loadLibrary, который не поддерживает OSGi. Когда вы вызываете loadLibrary из пакета OSGi, он будет использовать загрузчик классов OSGi (который учитывает пакет), чтобы найти, где находится DLL, и в этом случае извлечь его из пакета и сделать его загружаемым через System.loadLibrary () вызов в конкретном месте.

Поскольку эта JNA, похоже, (а) не знает OSGi и (б) избыточна, почему бы просто не использовать вместо этого System.loadLibrary ()?

Если вам нужно написать и то, и другое, тогда выполнить System.loadLibrary () в методе start () пакета в BundleActivator, который принесет встроенную библиотеку (вы, вероятно, захотите убедиться, что, если она не может быть загружена, пакет не может быть запущен в любом случае ).

7
ответ дан 16 December 2019 в 21:44
поделиться

Я предлагаю вам попробовать упаковать dll как jar:

jar cvf foo.dll.jar foo.dll

и загрузить jar как обычную библиотеку.

0
ответ дан 16 December 2019 в 21:44
поделиться

В документации JNA говорится:

  • Сделайте вашу целевую библиотеку доступной для вашей программы Java. Есть два способа сделать это:
    • Предпочтительный метод - установить в системном свойстве jna.library.path путь к целевой библиотеке. Это свойство похоже на java.library.path , но применяется только к библиотекам, загруженным JNA.
    • Измените соответствующую переменную среды доступа к библиотеке перед запуском виртуальной машины. Это ПУТЬ в Windows, LD_LIBRARY_PATH в Linux и DYLD_LIBRARY_PATH в OSX.

Чтобы обойти этот недостаток, вы можете устранить абсолютный путь к библиотеку и загрузите ее.

Предполагая, что это стандартный загрузчик классов Eclipse, вы можете выполнить ClassLoader.findLibrary () , который должен найти локальную библиотеку в пакете.

1
ответ дан 16 December 2019 в 21:44
поделиться
Другие вопросы по тегам:

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