2010-12-13 11 views
6

Un jar de terceros que uso intenta cargar una biblioteca nativa usando System.loadLibrary. Creo que lo que está sucediendo es que una de las bibliotecas cargadas tiene una dependencia en otra biblioteca nativa. Señalar -Djava.library.path no funciona correctamente en este caso. Las instrucciones del sitio de la aplicación colocan los dlls en el directorio jre/bin, pero creo que esta es una idea realmente mala (especialmente cuando se trata de implementar en sitios de clientes).Dependencias Java System.loadLibrary

Por lo tanto, esta pregunta es realmente 2 partes.

  1. ¿Tiene sentido que si un lib intentos nativos para cargar otro lib nativo que Djava.library.path no funciona?

  2. ¿Existe una buena solución para solucionar este problema? Supongo que podría llamar explícitamente a System.loadLibrary en todos los dlls (ni siquiera estoy seguro de si esto funcionaría), pero tendría que asegurarme de llamarlos en el orden correcto, de lo contrario tendré el mismo problema.

EDIT: Creo que esto tiene sentido que está sucediendo, y la mejor solución que he leído hasta ahora es utilizar Dependency Walker para averiguarlo y luego cargarlos en orden inverso ... pero 'm abierto a mejores sugerencias ...

gracias, Jeff

Respuesta

4

Sí, tiene sentido que las bibliotecas nativas no utilizan el Djava.library.path propiedad Java para enlazar a otras bibliotecas nativas.

Algunas posibles enfoques:

  • El tarro de terceros se fija para cargar sus propias dependencias, confiando en java.library.path.
  • Su código carga las DLL requeridas por el jar de terceros en orden topográfico inverso. Sin embargo, esto hace que su código especifique las dependencias del jar de terceros. Esas dependencias pueden cambiar.
  • Utiliza la ruta de búsqueda de DLL específica del sistema operativo (por ejemplo, utilizando LD_LIBRARY_PATH en Unix/Linux/Mac o PATH en Windows). Sin embargo, esto podría requerir un script de inicio.
+1

Intenté cargar en orden inverso, y funciona, así que tal vez use ese enfoque, a menos que me falte alguna solución mágica. –

+0

Eso es probablemente lo que yo haría también, además de tal vez presentar un defecto a un tercero. Si está haciendo un software multiplataforma, las bibliotecas vinculadas dinámicamente pueden diferir entre plataformas. ¡Buena suerte! –

Cuestiones relacionadas