2010-11-06 15 views
9

¿cómo puedo cargar una biblioteca desde un contenedor? p.Cargar biblioteca del contenedor

Test.jar 
+- libAbc.so 
+- libDef.so 
+- ... 
+1

posible duplicado de [cómo hacer un archivo jar que incluya archivos dll] (http://stackoverflow.com/questions/1611357/how-to-make-a-jar-file-that-include-dll-files) –

+1

Posible duplicado de [Extraer y cargar la DLL de JAR] (http://stackoverflow.com/questions/4764347/extract-and-load-dll-from-jar) – Raedwald

Respuesta

1

código nativo está siendo cargado por el sistema operativo subyacente, y si ese código no puede mirar dentro de un frasco-archivo para recoger los bytes que desea cargar - la que Windows no puede - usted debe hacerlo accesible en el sistema de archivos usted mismo.

¿Puede implementar su biblioteca junto a su archivo jar?

0

Las bibliotecas se deben cargar desde el sistema de archivos. Por lo tanto, podría extraer su biblioteca del contenedor en un directorio temporal y cargarla.

6

Debe descomprimirlo en algún directorio temporal y usar `System.load (" ruta/a/libAbc.so ").

Esto ha sido discussed previously.

Editado: corrigió el enlace.

+0

Su enlace 'discutido anteriormente' no parece ser relevante –

+0

Lo siento, mi error. El enlace ha sido corregido. –

7

Probablemente no es la respuesta que está buscando (extraer el archivo en una ubicación temporal es la respuesta que está buscando), pero pensé que me gustaría compartir alguna experiencia del mundo real:

La instalación de cañerías requiere para extraer la biblioteca del contenedor, asegúrese de que se limpie después, no entre en conflicto con otras aplicaciones que puedan estar usando el contenedor, etc. es muy complicado. Se puede hacer, pero es muy probable que termine con toneladas de copias temporales de sus bibliotecas que abarroten el sistema del usuario, o terminará con conflictos entre varias aplicaciones que usan las bibliotecas.

Cuando agrega el hecho de que muchos sistemas operativos no permiten que se use ningún archivo como biblioteca (y con frecuencia, los permisos para el usuario que ejecutará su aplicación no les permiten marcar un archivo arbitrario en la carpeta temporal para la ejecución), la idea de empaquetar las bibliotecas nativas dentro del contenedor se vuelve menos atractiva.

Lo que finalmente terminamos haciendo fue cambiar a un modelo donde tenemos nuestro instalador (que hace ejecutar con suficientes permisos) coloque la biblioteca nativa apropiada junto con el contenedor. Esto es bastante simple de hacer, mantiene todas las bibliotecas en ejecución en el mismo lugar, y es fácil de administrar y comprender (tratando de rastrear una incompatibilidad de versión en una aplicación, b/c está intentando cargar una biblioteca que se guardó en almacenamiento temporal por una segunda aplicación es una pesadilla total).

Cuestiones relacionadas