Веб-приложение Java не может пользоваться собственной библиотекой (.so)

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

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

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

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

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

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

Кто-либо может сказать мне, что я делаю неправильно?

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

7
задан Rob 27 February 2010 в 14:34
поделиться

2 ответа

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

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

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

4
ответ дан 7 December 2019 в 10:00
поделиться

решено!

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

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

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

Будьте здоровы

2
ответ дан 7 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

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