Веб-приложение Java не может использовать собственную библиотеку (.so) - PullRequest
6 голосов
/ 23 февраля 2010

Техническое резюме: я разрабатываю веб-сервис Java, развернутый на GlassFish v3 и работающий на CentOS 5.

Мой веб-сервис использует функции, предоставляемые собственной библиотекой (.so). Нативная библиотека работает нормально, однако мне не очень повезло в правильной настройке среды для загрузки нативной библиотеки, но она не будет затронута повторным развертыванием веб-приложения без перезапуска сервера приложений.

То, что я сделал до сих пор:

Изначально я загрузил библиотеку (static {System.load (path / to / libabc.so)});) в коде веб-службы, все пути заданы правильно, и все работает нормально, пока я не переустановлю приложение и не он жалуется, что библиотека загружается другим ClassLoader. Я обнаружил, что нативные библиотеки загружаются только один раз.

Чтобы попытаться решить эту проблему, я затем удалил код загрузки библиотеки из веб-приложения, создал класс Singleton, обернул его в модуль Lifecyle, развернул его в общей папке lib GlassFish и затем настроил GlassFish для запуска оболочки, когда он запускает. Идея заключается в том, что теперь все веб-приложения смогут ссылаться на него, поскольку он не привязан к какому-либо конкретному веб-приложению и загружен ClassLoader выше в иерархии.

Когда GlassFish запускается, нативная библиотека успешно загружена (linux> lsof | grep libabc.so). Однако код веб-службы завершается с ошибкой UnsatisfiedLinkError при выполнении нативного метода в моем коде Java веб-службы. Мне кажется, что код в веб-приложении не имеет доступа к библиотеке, загруженной при запуске.

Может кто-нибудь сказать мне, что я делаю не так?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 23 февраля 2010

Я не могу много сказать о "модуле Lifecyle" (я не знаю, должны ли они быть "видимыми" для приложений, развернутых в GlassFish), но ...

Я бы действительно поместил библиотеку JNI и класс, который вызывает System.loadLibrary(String), например singleton, за пределы веб-приложения и развернул бы этот код в domain/lib или domain/lib/applibs (см. Расположение файлов в V3 и эта тема для дополнительной информации о них).

Это должно сделать код видимым для вашего приложения и вашего приложения устойчивым к повторному развертыванию.

2 голосов
/ 27 февраля 2010

решена!

Наконец, я собрал кусочки.

отсутствует кусок Добавлена ​​библиотека JNI (например, jni_wrapper_for_libabc.jar) в общую папку GF domains/domain1/lib, и она заработала. Собственная библиотека загружается классом Singleton в модуле жизненного цикла, который вызывается при запуске GF.

Большое спасибо, Паскаль, отличный помощник !!

Приветствия

...