Cómo agregar una biblioteca nativa a "java.library.path" con el lanzamiento de Eclipse (en lugar de anularlo)

90

Tengo una biblioteca nativa que debe agregarse a java.library.path . Con el argumento JVM -Djava.library.path = path ... Puedo establecer la ruta como quiera.

Mi problema es que mi otra biblioteca (informes de pentaho) busca fuentes basadas en el java.library.path predeterminado (incluidos los directorios del sistema, etc.) y la configuración manual anula la ruta predeterminada.

Entonces: ¿cómo puedo agregar una entrada de ruta al java.library.path predeterminado en lugar de anularlo (lo que parece hacerse con -Djava.library.path)? (No quisiera agregar la ruta predeterminada a mano, lo que no sería bueno por el bien de la implementación)

EDITAR: Lo siento por los detalles faltantes; Estoy trabajando con Eclipse. (La implementación se realiza con JNLP y allí puedo usar nativelib en recursos )

Touko
fuente
1
Por favor, consulte la respuesta aceptada para esta pregunta en su lugar; para mí es mucho mejor: stackoverflow.com/questions/957700/…
laher
La pregunta "cómo agregar una biblioteca nativa a ..." es confusa. Probablemente se trate de agregar (agregar o anteponer) otra "ruta de biblioteca", es decir, asumiendo que Eclipse muestra algo como java.library.path = ruta1: ruta2: ruta3 por defecto, la pregunta es cómo iniciar Eclipse terminando en java.library .path = my / lib / folder: path1: path2: path3
whaefelinger

Respuestas:

46

Había olvidado este problema ... En realidad estaba preguntando con Eclipse, lo siento por no haber dicho eso originalmente. Y la respuesta parece ser demasiado simple (al menos con 3.5; probablemente también con versiones anteriores):

Argumentos de configuración de ejecución de Java: argumentos de VM:

-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"

No debe olvidar las comillas, de lo contrario, hay problemas con los espacios en PATH.

Touko
fuente
7
Si hay dos bibliotecas compartidas, una dependiente de la otra, esto no funcionará. El primero lo encuentra el tiempo de ejecución de Java, pero el segundo lo resuelve el cargador dinámico del sistema. La única solución que he encontrado es configurar LD_LIBRARY_PATH.
Kevin Cline
4
La respuesta dada por @Touko no se ajusta a la pregunta original que trata de agregar o anteponer una carpeta de biblioteca nativa. Al menos en Mac OS 10.8, ni $ PATH ni $ LD_LIBRARY_PATH ni $ {workspace_loc: project} \ lib tienen algo que ver con el valor predeterminado. Por ejemplo, en mi Mac, el valor predeterminado es $ HOME / Library / Java / Extensions: / Library / Java / Extensions: / Network / Library / Java / Extensions: / System / Library / Java / Extensions: / usr / lib / java :.
whaefelinger
Si está utilizando TestNG en Eclipse, deberá editar la configuración de ejecución de TestNG: - En la ventana Configuraciones de ejecución, seleccione la configuración de TestNG de destino. - Seleccione la pestaña Entorno - Agregue una variable PATH y establezca su valor en su objetivo - Deje el interruptor predeterminado "Agregar entorno al entorno nativo".
Philippe
¿Puedo dar un ejemplo?
basickarl
@kevincline, ¿le importaría explicar por qué exactamente no funcionará en ese caso? Acabo de encontrarme con ese problema y estoy tratando de entender qué está mal con esta solución.
anula
14

Si desea agregar una biblioteca nativa sin interferir java.library.pathen el tiempo de desarrollo en Eclipse (para evitar incluir rutas absolutas y tener que agregar parámetros a su configuración de lanzamiento), puede proporcionar la ruta a la ubicación de las bibliotecas nativas para cada Jar en Java Build Cuadro de diálogo Ruta en Ubicación de biblioteca nativa . Tenga en cuenta que el nombre del archivo de la biblioteca nativa debe corresponder al nombre del archivo Jar. Consulte también esta descripción detallada .

Fabian Steeg
fuente
3
-1. Está asumiendo que el usuario final está ejecutando la aplicación desde un IDE, lo cual es poco probable.
finnw
@finnw veo tu punto. Encontré la pregunta buscando una solución sobre cómo agregar una biblioteca nativa en el IDE durante el desarrollo, sin anular, java.library.pathy regresé después de encontrar la solución en otro lugar. Editaré mi respuesta para que quede más claro.
Fabian Steeg
De hecho, estoy trabajando con Eclipse aunque no lo mencioné en la pregunta.
Touko
En realidad, esto no funciona en la versión actual de Eclipse (Luna) porque la configuración de la propiedad anula java.library.path como el usuario describe como un problema en la pregunta.
Alex N.
9

SWT coloca las DLL nativas necesarias en un JAR. Busque "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar" para ver un ejemplo.

Los DLL deben estar en la raíz del JAR, el JAR debe estar firmado y el DLL debe aparecer con la suma de comprobación en META-INF / MANIFEST.MF para que la VM los recoja.

Aaron Digulla
fuente
2
¿Cómo puedo hacerlo con NetBeans?
Maciek Sawicki
AFAIK, NetBeans usa Ant para construir el proyecto. Lea la documentación de Ant sobre cómo crear archivos JAR firmados y cómo poner cosas como archivos DLL en el manifiesto.
Aaron Digulla
¿Cómo lo configuro para agregar el .dll, en Eclipse?
NoBugs
@NoBugs: En Eclipse, esta publicación debería ayudar: eclipsezone.com/eclipse/forums/t49342.html
Aaron Digulla
@AaronDigulla, ¿sugiere que DLL siempre se adjunte de esta manera? Pensé que solo busca algo como java.library.path. ¿Sugieres que solo busque raíz jar?
4

En Windows, así:

-Djava.library.path = "C: / MyLibPath;% PATH%"

% PATH% es su antiguo -Djava.library.path

Andy Boot
fuente
Probé esta idea pero resultó como java.library.path: D: \ Workspace \ myProject \ lib;% PATH%
Touko
También puede usar $ {system_property: java.library.path}
Rob Elsner
2
El valor predeterminado en UNIX / Mac / GNU Linux es LD_LIBRARY_PATH. PATH es una cosa de Windows.
whaefelinger
2

¿Puede solucionar esto llamando a System.load () mediante programación para cargar su biblioteca nativa? Este método (a diferencia de System.loadLibrary () ) le permite especificar una ruta absoluta.

Simon Nickerson
fuente
1
Por favor, explique cómo llamaría a System.load () programáticamente al iniciar Eclipse.
whaefelinger
2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 establece que no hay mecanismos de sustitución implementados en el lanzador de Eclipse, al menos no hasta el lanzamiento de Juno.

Por lo tanto, es (casi) imposible agregar o anteponer otra carpeta de biblioteca a java.library.path al iniciar Eclipse sin el conocimiento previo de la configuración predeterminada.

Escribí casi, porque debería ser posible dejar que Eclipse se inicie, volcar el contenido de java.library.path y detener Eclipse en un comando. El volcado se analizaría y luego se tomaría como entrada para iniciar Eclipse, es decir

#!/bin/bash
# get default value of java.library.path (somehow)
default_lib_path=$( start_dump_stop_eclipse_somehow )  

# now launch Eclipse
eclipse --launcher.appendVmargs \
         -vmargs \
         -Djava.library.path="/my/native/lib/folder:${default_lib_path}"
whaefelinger
fuente
1

En sistemas UNIX, puede agregar a la variable de entorno LD_LIBRARY_PATH. En Windows, la JVM establece automáticamente la propiedad del sistema, java.library.path, en PATH; así que si el dll está en su RUTA, entonces está listo.

geowa4
fuente
El iniciador del hilo fue muy específico sobre cómo "agregar" una segunda carpeta de biblioteca nativa, ¿no está de acuerdo?
whaefelinger
@ user667073 He estado diciendo lo mismo ... APENDIENDO es la pregunta, el iniciador de subprocesos ya sabe cómo cargar una
biblioteca
STS 3.4.0 y Mac OS 10.8: la configuración de LD_LIBRARY_PATH no tiene ningún impacto en java.library.path. Probé esto con Subclipse / JavaHL. Este funcionó: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib mientras exporta LD_LIBRARY_PATH = / opt / local / lib; STS tuvo fue negativo.
whaefelinger
1

Ventana-> Preferencias-> Java-> JRE instalados. Luego elija su JRE actual (JDK) y haga clic en Editar. Complete los argumentos predeterminados de la máquina virtual: -Djava.library.path = / usr / local / xuggler / lib. ¡Hecho!

Vadym
fuente
1
Esta respuesta es inútil porque el iniciador del hilo pregunta específicamente sobre "Cómo agregar una biblioteca nativa [..] en lugar de anular [..]". Esta respuesta simplemente anula la configuración predeterminada.
whaefelinger
1

La solución ofrecida por Rob Elsner en uno de los comentarios anteriores funciona perfectamente (OSX 10.9, Eclipse Kepler). Uno tiene que agregar sus rutas adicionales a las separadas por ":".

También puede usar $ {system_property: java.library.path} - Rob Elsner 22 de noviembre de 2010 a las 23:01

Johan
fuente
0

El nombre del archivo de la biblioteca nativa debe corresponder al nombre del archivo Jar. Esto es muy, muy importante. Asegúrese de que el nombre del jar y el nombre de la dll sean iguales. Además, consulte la publicación de Fabian Steeg. Mi descarga de jawin contenía diferentes nombres para dll y jar. Era jawin.jar y jawin d .dll, tenga en cuenta una 'd' adicional en el nombre del archivo dll. Simplemente lo renombré a jawin.dll y lo configuré como una biblioteca nativa en eclipse como se menciona en la publicación " http://www.eclipsezone.com/eclipse/forums/t49342.html "

Dhana
fuente
La pregunta es acerca de agregar una biblioteca nativa (carpeta) al iniciar Eclipse.
whaefelinger
0

Por alguna razón, no pude hacer que varias carpetas funcionaran (bueno, lo hizo por un tiempo, pero tan pronto como necesité más dlls y agregué más carpetas, ninguna con espacios en blanco en la ruta). Luego copié todos los archivos DLL necesarios en una carpeta y lo tenía como mi java.library.path y funcionó. No tengo una explicación; si alguien la tiene, sería genial.

Ustaman Sangat
fuente
Bueno, si se encuentra una biblioteca nativa a través de java.library.path y copia otra en esa carpeta, entonces parece natural que la segunda también se encuentre, ¿no es así?
whaefelinger
Por supuesto, por eso usé eso, ¡duh! Lo que me preguntaba era si se podían agregar varias carpetas sin tener que mover o enlazar simbólicamente.
Ustaman Sangat
0

Muchas de las respuestas existentes asumen que desea configurar esto para un proyecto en particular, pero necesitaba configurarlo para Eclipse en con el fin de apoyar la autenticación integrada para el controlador JDBC de SQL Server.

Para hacer esto, seguí estas instrucciones para iniciar Eclipse desde la línea de comandos de Java en lugar de su lanzador normal. Luego modifiqué ese script para agregar mi argumento -Djava.library.path a la línea de comandos de Java.

CrazyPyro
fuente
0
  1. En Windows: agregue la ruta a la biblioteca a la variable de entorno PATH.
  2. En Linux: agregue la ruta a la biblioteca a la variable de entorno LD_LIBRARY_PATH.
  3. En Mac: agregue la ruta a la biblioteca a la variable de entorno DYLD_LIBRARY_PATH.

java.library.path se inicia con los valores de las variables anteriores en su plataforma correspondiente.

Esto debería funcionar en cualquier IDE.

Puede probar si el valor es el que espera llamando java -XshowSettings:properties

rboc
fuente
-2

En Windows, he descubierto que lo importante es iniciar Eclipse desde la línea de comandos en lugar de desde el menú Inicio o un acceso directo, siempre que la DLL nativa esté en un directorio en su PATH. Aparentemente, esto asegura que el directorio adecuado esté en la ruta.

Alan
fuente
Corríjame si me equivoco, pero creo que el directorio de trabajo actual en Windows se incluye automáticamente al buscar archivos DLL (o binarios ejecutables). Por lo tanto, cuando cambia a la carpeta donde están las DLL y comienza a Eclipse, entonces sí, se encuentran las DLL que está buscando. Aparte de eso, ¿cómo se relaciona esta respuesta con la pregunta de los iniciadores del hilo?
whaefelinger