.dll ya cargado en otro cargador de clases?

Tengo una aplicación web ejecutándose bajo Tomcat 3.2.1 que necesita hacer llamadas JNI para acceder a los datos y métodos en el código heredado de C ++. Se carga un servlet al inicio de la aplicación web que, como parte de su método init , provoca que un conjunto de datos específico para esa instancia de aplicación web se cargue en las estructuras de datos de C ++.

Este código de Java para este servlet contiene lo siguiente:

 static { try { System.loadLibrary("JCoreImpl"); System.out.println("JCoreImpl loaded"); m_bLibraryLoaded = true; } catch (UnsatisfiedLinkError e) { m_bLibraryLoaded = false; System.out.println("JCoreImpl NOT loaded " + e); } } 

Las cosas funcionan bien si solo hay una aplicación web (llamémosla “webapps / aaa”).

Si tengo una segunda aplicación web (“webapps / bbb”) que es idéntica a webapps / aaa, excepto el conjunto de datos utilizado en las estructuras de datos de C ++, entonces webapps / aa comienza bien, pero cuando webapps / bbb se inicia, obtengo un error que indica que:

 JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader 

Necesito tener una instancia separada de la biblioteca nativa para cada una de mis aplicaciones web, ya que cada instancia necesita contener datos que sean exclusivos de esa aplicación web en particular. He buscado a través de los archivos de correo y leído correos electrónicos de Craig McLanahan explicando la jerarquía del cargador de clases. Pero no he podido encontrar nada específico para cargar una instancia única de una biblioteca nativa para cada aplicación web.

No puede cargar la misma biblioteca nativa dos veces.

Coloque la clase en un archivo jar en /lib/ , se compartirá durante todas las guerras.

Consulte la sección Estoy encontrando problemas con el cargador de clases al usar JNI en Tomcat en el wiki de Tomcat HowTo ( http://wiki.apache.org/tomcat/HowTo )

Copie los archivos DLL en archivos temporales en un directorio temporal antes de cargarlos. Borre los archivos cuando haya terminado. De esta manera, puede asegurarse de que la misma DLL no se carga dos veces.

Tuve este problema y lo resolví:

Problema:

El problema se debe a algunas configuraciones de su servidor de aplicaciones que provocan la creación de más de un archivo war o ear y, en consecuencia, crea más de un archivo desplegado. Estos archivos implementados intentan tener un acceso simultáneo a su biblioteca nativa que se cargó en un bloque estático.

Solución:

  1. Detenga su servidor de aplicaciones y cierre la IDEA
  2. Finaliza todos los procesos de java desde el administrador de tareas
  3. Vaya a esta dirección de su servidor de aplicaciones: jboss-eap-6.4.0\standalone\configuration y abra el archivo standalone.xml
  4. En standalone.xml , elimine toda la etiqueta de deployments (No se preocupe, cuando vuelva a ejecutar el servidor de aplicaciones, inserta esta etiqueta
  5. Vaya a esta dirección de su servidor de aplicaciones: jboss-eap-6.4.0\standalone\deployments y elimine todos los archivos desplegados y war . (Puede hacer una copia de seguridad de sus archivos de guerra)
  6. Abra IntelliJ Idea y vaya a: Editar configuración JBOSS -> pestaña Implementación
  7. Elimine la implementación actual y agregue una nueva que se debe exploded