Одним фактором, который не был упомянут еще, является выравнивание нагрузки. Если Вы начинаетесь, думая о веб-сервере и базе данных как отдельные машины, Вы оптимизируете для меньшего количества сетевых распространений в прямом и обратном направлениях, и также становится легче добавить второй веб-сервер или второй механизм базы данных, когда потребности увеличиваются.
Проблема заключается в специализированном вызове JNA loadLibrary, который не поддерживает OSGi. Когда вы вызываете loadLibrary из пакета OSGi, он будет использовать загрузчик классов OSGi (который учитывает пакет), чтобы найти, где находится DLL, и в этом случае извлечь его из пакета и сделать его загружаемым через System.loadLibrary () вызов в конкретном месте.
Поскольку эта JNA, похоже, (а) не знает OSGi и (б) избыточна, почему бы просто не использовать вместо этого System.loadLibrary ()?
Если вам нужно написать и то, и другое, тогда выполнить System.loadLibrary () в методе start () пакета в BundleActivator, который принесет встроенную библиотеку (вы, вероятно, захотите убедиться, что, если она не может быть загружена, пакет не может быть запущен в любом случае ).
Я предлагаю вам попробовать упаковать dll как jar:
jar cvf foo.dll.jar foo.dll
и загрузить jar как обычную библиотеку.
В документации JNA говорится:
jna.library.path
путь к целевой библиотеке. Это свойство похоже на java.library.path
, но применяется только к библиотекам, загруженным JNA. ПУТЬ
в Windows, LD_LIBRARY_PATH
в Linux и DYLD_LIBRARY_PATH
в OSX. Чтобы обойти этот недостаток, вы можете устранить абсолютный путь к библиотеку и загрузите ее.
Предполагая, что это стандартный загрузчик классов Eclipse, вы можете выполнить ClassLoader.findLibrary ()
, который должен найти локальную библиотеку в пакете.