2009-06-23 6 views
20

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

Este código 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); 
    } 
} 

cosas funcionan bien si sólo hay una aplicación web (vamos a llamarlo "webapps/AAA").

Si tengo una segunda aplicación de web ("webapps/BBB") que es idéntica a webapps/aaa excepto por el conjunto de datos utilizado en estructuras de datos el C++, a continuación, webapps/aaa pone en marcha muy bien, pero cuando webapps/bbb se inicia consigo un error indicando que:

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

es necesario disponer de una instancia independiente de la biblioteca nativa para cada uno de mis aplicaciones web como cada instancia debe contener los datos que son exclusivos de esa webapp particular. He buscado en los archivos de correo electrónico y leído los correos electrónicos de Craig McLanahan explicando la jerarquía del cargador de clases. Pero I have no ha podido encontrar nada específico para cargar una instancia única de una biblioteca nativa para cada aplicación web.

Respuesta

13

No puede cargar la misma biblioteca nativa dos veces.

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

0

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

0

he tenido este problema y lo resolvió:

Problema:

El problema se debe a que algunas configuraciones de servidor de aplicaciones que causan para crear más de un war o ear archivos 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 el servidor de aplicaciones y cerrar el IDEA
  2. Finalizar todas java procesos de administrador de tareas
  3. Ir a esta dirección de su servidor de aplicaciones: jboss-eap-6.4.0\standalone\configuration y abierto standalone.xml archivo
  4. En el standalone.xml, elimine toda la etiqueta deployments (No se preocupe, cuando vuelva a ejecutar el servicio de la aplicación r, 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 . (Puede copia de seguridad de sus archivos de guerra) Idea
  6. abierto IntelliJ y vaya a: Editar configuración JBOSS -> pestaña Distribución
  7. Eliminar despliegue actual y añadir una nueva que debe ser exploded
Cuestiones relacionadas