Разработки / Загрузка Native библиотек в Tomcat on 06 March 2008 10:32
Если в Java попытаться загрузить одну и ту же native библиотеку 2 раза, то JVM падает со следующей ошибкой:
java.lang.UnsatisfiedLinkError: Native Library <native library name> already loaded in another classloader

В Tomcat работает несколько ClassLoader'ов, а нужно, чтобы каждый конкретный jar подгружался ровно один раз. Поэтому не следует кидать одну и ту же библиотеку в WEB-INF/lib для каждого приложения. Правильнее добавить в CLASSPATH в файле bin/setclasspath.sh путь к этой библиотеке. Или воспользоваться механизмом ENDORSED_DIRS, устанавливая параметр JVM java.endorsed.dir в директорию, где будут находиться все автоматически подгружаемый библиотеки. Для Tomcat <= 5.5 это $CATALINA_HOME/common/lib, а для 6 >= это $CATALINA_HOME/endorsed, но всё это можно переопределить в bin/catalina.sh или bin/setclasspath.sh.
Ну и, разумеется, не следует забывать указывать путь к директории с native библиотекой, а иначе получите java.lang.UnsatisfiedLinkError: no <native library name> in java.library.path.
Это делается установкой переменной окружения LIBRARY_PATH для Windows и LD_LIBRARY_PATH для Solaris. Либо можно указать параметр JVM java.library.path.

Собственно, я разбирался с этим, когда имел 2 приложения, которые использовали OCI драйвер для Oracle и, соотвественно, требовали библиотеку ocijdbc10. Два дня шаманил.

Author: Макс

Tags: JNI, java native library, UnsatisfiedLinkError, java.library.path

Add comment
Rating: 2.95 / Rate 1 2 3 4 5

    Search: 
    Hello, Guest. ( Login / Create account )