java properties jni

Establecer las propiedades del sistema de Java con un archivo de configuración



properties jni (6)

¿Es posible inicializar las propiedades del sistema Java utilizando algún tipo de archivo de configuración?

(es decir: puede establecer java.library.path usando un archivo dentro de su jar)

EDITAR: Aclaración: estoy preguntando específicamente sobre la inicialización de las propiedades del sistema a un valor en un archivo, no configurándolas más tarde desde el interior de la máquina virtual. Sí, puede cambiar las propiedades del sistema a lo que desee con facilidad después de que la máquina se inicie, pero las clases del sistema Java no usarán los nuevos valores.

En términos prácticos, esto significa que System.setProperty y System.setProperties son inútiles para cargar bibliotecas nativas, ya que JNI siempre usará el valor original de java.library.path para cargar bibliotecas. Estoy tratando de averiguar si existe una alternativa más limpia a simplemente poner -Djava.library.path = lo que sea en las secuencias de comandos de inicio en todas partes.


Creo que la razón por la cual System.setProperty(key,value) es inútil para java.library.path en su programa es que su aplicación se inicia, necesita configurarla antes de que se ejecute su programa.

Verifique su biblioteca nativa, si la biblioteca tiene alguna dependencia que no esté incluida en el java.library.path , System.load fallará, como si System.setProperty(key, value) no funcionara como se esperaba.


Hay una manera de establecer java.library.path programáticamente, vea esto .

El código es un truco para establecer el campo sys_path en el ClassLoader,

System.setProperty( "java.library.path", "/path/to/libs" ); Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" ); fieldSysPath.setAccessible( true ); fieldSysPath.set( null, null );


No puede inicializarlos hasta donde yo sé, pero definitivamente puede anular sus valores a cualquier cosa que desee, utilizando la fuente que desee.


Puede analizar el archivo de propiedades con código adicional (otra instancia de JVM), redirigir su salida a var y usar esta variable como parámetro para su invocación de Java. Por ejemplo:

public class SystemPropertyLoader { public static void main(String[] args) throws Exception { String file = args[0];//TODO check args Properties properties = new Properties(); InputStream is = new FileInputStream(file); properties.load(is); is.close(); StringBuilder builder = new StringBuilder(); for (Entry e : properties.entrySet()){ builder.append("-D"); builder.append(e.getKey()); builder.append(''=''); builder.append(e.getValue()); builder.append('' ''); } System.out.println(builder.toString()); } }

y

#!/bin/ksh properties_variable=$(java SystemPropertyLoader input.properties)


Sería bastante simple de hacer usted mismo:

public static void main(String[] args) { Properties p = new Properties(); p.load(...); // Load the properties from a file in your jar for (String name : p.stringPropertyNames()) { String value = p.getProperty(name); System.setProperty(name, value); } }


Use la variable de entorno JAVA_TOOL_OPTIONS . _JAVA_OPTIONS también puede funcionar, pero no está documentado en absoluto. JAVA_TOOL_OPTIONS está poco documentado, pero aquí hay algunos enlaces:

Un ejemplo de uso:

set JAVA_TOOL_OPTIONS=-Dmy.property=sth

Al iniciar JVM, debería ver un mensaje:

Picked up JAVA_TOOL_OPTIONS: ...