programacion icon adjust java java.library.path platform-independence

icon - put image in jlabel java



¿Puedo averiguar a qué variable se asigna java.library.path en la plataforma actual? (2)

En mi caja de linux, esto es lo que haría:

$ cat GetSystemProperty.java import java.util.Properties; import java.util.Enumeration; public class GetSystemProperty { public static void main(String args[]) { if( args.length == 0 ) { Properties p = System.getProperties(); Enumeration keys = p.keys(); while (keys.hasMoreElements()) { String key = (String)keys.nextElement(); String value = (String)p.get(key); System.out.println(key + " : " + value); } } else { for (String key: args) { System.out.println(System.getProperty( key )); } } } } $ javac GetSystemProperty.java $ java GetSystemProperty java.library.path /usr/lib/jvm/java-6-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-6-openjdk/jre/lib/amd64:/usr/lib/jvm/java-6-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib/jni:/lib:/usr/lib

Hasta ahora he aprendido lo siguiente sobre la propiedad java.library.path:

  • Se usa cuando se cargan bibliotecas nativas, a diferencia de las clases Java.
  • Su valor predeterminado depende del sistema operativo:
    • En Windows, se asigna a PATH
    • En Linux, se asigna a LD_LIBRARY_PATH
    • En OS X, se asigna a DYLD_LIBRARY_PATH

(Por favor corríjame si he entendido mal alguno de los anteriores)

Mi motivación:

Quiero modificar el valor de java.library.path visto por una aplicación Java desde el marco que configuré para invocar la aplicación Java. Quiero hacer esto no configurando directamente la propiedad java.library.path, sino modificando la variable de ruta del sistema a la que se asigna. Me gustaría una forma limpia de hacer esto que no tenga un código feo específico del sistema operativo o, si es posible, omitir los casos perimetrales.

Mi pregunta:

¿Hay alguna forma de preguntarle a la implementación local de Java a qué variable de entorno java.library.path se asigna?

Luego, en un script de shell, podría escribir algo como:

path_var = get_library_path_variable # the magic function I want to call ${path_var} = /my/custom/path:${${path_var}}


Esta no es una pregunta totalmente irrazonable, pero no hay una buena respuesta, así que para la posteridad, intentaré explicar por qué te quedaste atascado y por qué no funcionará.

  1. java.library.path no se garantiza que se establezca a partir de una variable de entorno. Puede especificar qué desea que sea con -Djava.library.path= . Más que probable, esto es lo que realmente quieres hacer de todos modos. Por eso existe la opción.

  2. Resulta (al menos en Windows) que la variable de entorno que está buscando no solo se usa sin ser molestada. Prueba este código.

    package com.; import java.util.Map; public class LibPathFinder { public static void main(String[] args) { String javaLibPath = System.getProperty("java.library.path"); Map<String, String> envVars = System.getenv(); System.out.println(envVars.get("Path")); System.out.println(javaLibPath); for (String var : envVars.keySet()) { System.err.println("examining " + var); if (envVars.get(var).equals(javaLibPath)) { System.out.println(var); } } } }

    Notarás que cuando se ejecuta, las dos primeras cosas que imprime son diferentes. Si Java está usando la variable PATH Windows, primero está jugando con el valor. Renuncié a investigar lo que estaba pasando. El punto era que no había una variable de entorno que coincidiera exactamente con java.library.path . No probé con Linux ni con OSX, su kilometraje puede variar

  3. Realmente no es muy agradable meterse con las variables de entorno de alguien como esta. Se utilizan para todo el shell, por lo que está comprometiendo a sus usuarios a tener su biblioteca compartida en su entorno, pero solo algunas veces . La única razón real para cambiar java.library.path es agregar bibliotecas nativas. Si está utilizando bibliotecas nativas, entonces ya tiene un código específico del sistema operativo (debe compilarse para la plataforma, ¿no?), Por lo que ya ha renunciado a la lucha por "no hay casos de borde de plataforma específica". Lo mejor que puede hacer es colocar su biblioteca nativa en un lugar donde la ruta del sistema (sea la que sea) ya la encuentre, o agregar la ruta de la biblioteca a ella de forma permanente con algún instalador de algún tipo. Si no quieres hacer ninguna de esas cosas, entonces sugiero usar una variación del código de @ malat, imprimir el java.library.path real, y luego java.library.path tu ruta a ese resultado en tu script, y luego usar La opción -D para configurarlo para la ejecución real del programa.