A resposta original de Adam Batkin levará você a uma solução, mas se você reimplantar seu webapp (sem reiniciar seu contêiner da web), deverá ocorrer o seguinte erro:
java.lang.UnsatisfiedLinkError: Native Library "foo" already loaded in another classloader
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1715)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646)
at java.lang.Runtime.load0(Runtime.java:787)
at java.lang.System.load(System.java:1022)
Isso acontece porque o ClassLoader que carregou originalmente sua DLL ainda faz referência a essa DLL. No entanto, seu webapp agora está sendo executado com um novo ClassLoader e, como a mesma JVM está em execução e uma JVM não permite 2 referências à mesma DLL, você não pode recarregá- la. Portanto, seu webapp não pode acessar a DLL existente e não pode carregar uma nova. Então .... você está preso.
Documentação do ClassLoader do Tomcat descreve por que seu webapp recarregado é executado em um novo ClassLoader isolado e como você pode contornar essa limitação (em um nível muito alto).
A solução é estender um pouco a solução de Adam Batkin:
package awesome;
public class Foo {
static {
System.loadLibrary('foo');
}
// required to work with JDK 6 and JDK 7
public static void main(String[] args) {
}
}
Em seguida, coloque um jar contendo APENAS esta classe compilada na pasta TOMCAT_HOME / lib.
Agora, dentro do seu webapp, você só precisa forçar o Tomcat a fazer referência a essa classe, o que pode ser feito da seguinte maneira:
Class.forName("awesome.Foo");
Agora sua DLL deve ser carregada no carregador de classe comum e pode ser referenciada a partir de seu webapp mesmo depois de ser reimplantada.
Faz sentido?
Uma cópia de referência de trabalho pode ser encontrada no código do google, static-dll-bootstrapper .