Техническая сводка: я разрабатываю веб-сервис 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 веб-сервиса. Мне кажется, что код в веб-приложении не имеет доступа к библиотеке загруженным при запуске.
Кто-либо может сказать мне, что я делаю неправильно?
Заранее спасибо.
Я не могу много сказать о «Модуле жизненного цикла» (я не знаю, должны ли они быть «видимыми» для приложений, развернутых в GlassFish) но ...
Я бы действительно поместил библиотеку JNI и класс, который вызывает System.loadLibrary (String)
, например синглтон, вне веб-приложения и развернул бы этот код в домене / lib
или домен / lib / applibs
(см. Макет файла в V3 и этот поток для получения дополнительной информации о них).
Это должно сделать код видимым для вашего приложения, а ваше приложение будет устойчивым к повторному развертыванию.
Наконец, я собрал все части вместе.
недостающий кусок Добавил библиотеку JNI (например, jni_wrapper_for_libabc.jar
) в общую папку GF domains/domain1/lib
и она заработала. Родная либа загружается классом Singleton в модуле Lifecycle Module, который вызывается при запуске GF.
Большое спасибо, Паскаль, отличная помощь!!!
Будьте здоровы