web-dev-qa-db-fra.com

Définir les propriétés du système Java avec un fichier de configuration

Est-il possible d'initialiser les propriétés du système Java à l'aide d'une sorte de fichier de configuration?

(c.-à-d. pouvez-vous définir Java.library.path en utilisant un fichier dans votre jar)

EDIT: Clarification: Je demande spécifiquement à propos de initializing les propriétés système à une valeur dans un fichier, et non pas à les définir ultérieurement à partir de la machine virtuelle. Oui, vous pouvez très facilement modifier les propriétés du système selon vos souhaits après le démarrage de la machine, mais les classes système Java n'utiliseront pas les nouvelles valeurs.

Concrètement, cela signifie que System.setProperty et System.setProperties sont inutiles pour charger des bibliothèques natives, car JNI utilisera toujours la valeur originale de Java.library.path pour charger des bibliothèques. J'essaie de voir s'il existe une alternative plus propre que de simplement mettre -Djava.library.path = quoi que ce soit dans les scripts de démarrage, où que vous soyez.

18
user597474

Il existe un moyen de définir Java.library.path par programme, voir this .

Le code est un hack pour définir le champ sys_path sur le chargeur de classe,

System.setProperty( "Java.library.path", "/path/to/libs" );

Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
15
sbridges

Ce serait assez simple de faire soi-même:

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);
    }
}
12
Ryan Stewart

Je pense que la raison pour laquelle System.setProperty(key,value) est inutile pour Java.library.path dans votre programme est que votre application est démarrée, vous devez la définir avant que votre programme ne soit exécuté. 

Vérifiez votre bibliothèque native. Si la bibliothèque a une dépendance qui n'est pas incluse dans le Java.library.path, System.load échouera, comme si System.setProperty(key, value) ne fonctionnait pas comme prévu.

2
George

Vous pouvez analyser le fichier de propriétés avec du code supplémentaire (une autre instance de JVM), rediriger sa sortie vers var et utiliser cette variable en tant que paramètre pour votre invocation Java. Par exemple:

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());
 }
}

et

#!/bin/ksh
properties_variable=$(Java SystemPropertyLoader input.properties)
2
zacheusz

Vous ne pouvez pas les initialiser pour autant que je sache, mais vous pouvez définitivement remplacer leurs valeurs par tout ce que vous voulez, en utilisant n'importe quelle source.

1
Perception

Utilisez la variable d'environnement Java_TOOL_OPTIONS. _Java_OPTIONS peut également fonctionner, mais il n'est pas documenté du tout. Le Java_TOOL_OPTIONS est faiblement documenté, mais voici quelques liens:

Un exemple d'utilisation:

set Java_TOOL_OPTIONS=-Dmy.property=sth

Lors du lancement de la machine virtuelle Java, vous devriez voir un message:

Picked up Java_TOOL_OPTIONS: ...
0
Jarekczek