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. Два дня шаманил.
Tags: JNI, java native library, UnsatisfiedLinkError, java.library.path