Собственная загрузка библиотеки Glassfish (.dll, .so)

Я использую недавно выпущенный Glassfish v3 и в то время как использование собственной glassfish библиотек периодически жаловалось бы

glassfish SEVERE: java.lang.UnsatisfiedLinkError: 
Native Library already loaded in another classloader

Процедура для загрузки собственных библиотек в предыдущем выпуске (v2.2) glassfish должна была просто поместить .dll файлы в GLASSFISH_HOME\lib. Теперь я не знаю, существует ли такая волшебная папка в v3 и если существует, действительно говорят. Я также проверил, что администратор экранирует и существует две переменные, я думаю, связаны с моей проблемой: Собственный Префикс Пути к библиотеке и Собственный Суффикс Пути к библиотеке. Я обыскивал Интернет для нахождения соответствующего описания того, что они делают и как я должен использовать их, но по-видимому никому не нравится говорить о них.

8
задан bmargulies 13 December 2009 в 12:54
поделиться

2 ответа

 java.lang.UnsatisfiedLinkError: собственная библиотека уже загружена в другой загрузчик классов

Собственная библиотека может быть загружена в JVM только один раз, и вы будете получать это сообщение об ошибке всякий раз, когда загружаете новую версию вызывающего класса (класс, в котором вызывается System.loadLibrary (String) находится) при повторном развертывании. Подробнее об этом ниже.

Процедура загрузки собственных библиотек в предыдущем выпуске glassfish (v2.2) заключалась в том, чтобы просто поместить файлы .dll в GLASSFISH_HOME \ lib .

Ну, это собственно только первая часть рассказа. Чтобы загрузить собственную библиотеку, вы, конечно, должны поместить ее в путь к библиотеке и , чтобы загрузить ее из кода Java. Для этого соглашение включает статический инициализатор, подобный этому:

class FooWrapper {
    static {
        System.loadLibrary("foo");
    }

    native void doFoo();
    }
}

Предполагая, что вы работаете с веб-приложением, Лучше всего не размещать собственные библиотеки ИЛИ их интерфейсы JNI в WEB-INF / lib или WEB-INF / classes , чтобы избежать проблем при перезагрузке приложения, как упоминалось выше. Другими словами, класс, который вызывает System.loadLibrary (String) , должен быть загружен загрузчиком классов, на который не влияет перезагрузка самого веб-приложения.

Итак, мой вопрос: где вы поместили этот код?

PS: Другой вариант - проверить, доступна ли уже библиотека перед ее загрузкой, но я бы этого не делал.

куда ты положил этот код?

PS: Другой вариант - проверить, доступна ли уже библиотека перед ее загрузкой, но я бы этого не делал.

куда ты положил этот код?

PS: Другой вариант - проверить, доступна ли уже библиотека перед ее загрузкой, но я бы этого не делал.

4
ответ дан 5 December 2019 в 21:19
поделиться

Первое: данный собственный класс может быть загружен только в один загрузчик классов.

Второе: каждое веб-приложение в контейнере сервлетов имеет свой собственный загрузчик классов.

Третье. : вы должны быть очень осторожны при написании нативного кода, чтобы его классы могли быть собраны в мусор.

Результат: как только вы загрузите нативный код в веб-приложение, вы, вероятно, получите эти ошибки, если попытаетесь выгрузить и перезагрузить его.

Я до некоторой степени пропускаю действительно простой вариант этой темы: просто загружаю два разных веб-приложения с одним и тем же собственным классом.

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

3
ответ дан 5 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

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