Установить свойства системы Java с помощью файла конфигурации - PullRequest
19 голосов
/ 18 июля 2011

Можно ли инициализировать свойства системы Java с помощью какого-либо файла конфигурации?

(т.е. вы можете установить java.library.path, используя файл внутри вашего jar-файла)

РЕДАКТИРОВАТЬ: Уточнение: я спрашиваю конкретно о инициализации системных свойств к значению в файле, не устанавливая их позже изнутри виртуальной машины. Да, вы можете легко изменить системные свойства после того, как машина запустится, но системные классы Java не будут использовать новые значения.

На практике это означает, что System.setProperty и System.setProperties бесполезны для загрузки собственных библиотек, поскольку JNI всегда будет использовать исходное значение java.library.path для загрузки библиотек. Я пытаюсь выяснить, есть ли более чистая альтернатива, чем просто помещать -Djava.library.path = что угодно в скриптах запуска везде.

Ответы [ 6 ]

15 голосов
/ 24 июля 2011

Есть способ установить java.library.path программно, см. this .

Код является хаком для установки поля sys_path в ClassLoader,

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

Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
13 голосов
/ 18 июля 2011

Это было бы довольно просто сделать самостоятельно:

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);
    }
}
2 голосов
/ 25 июля 2011

Я думаю, что причина, по которой System.setProperty(key,value) бесполезна для java.library.path в вашей программе, заключается в том, что ваше приложение запущено, вам нужно установить его до запуска программы.

Проверьте вашу нативную библиотеку, если у библиотеки есть какая-либо зависимость, не включенная в java.library.path, System.load не будет работать, как если бы System.setProperty(key, value) не работал должным образом.

2 голосов
/ 24 июля 2011

Вы можете проанализировать файл свойств с помощью дополнительного кода (еще один экземпляр JVM), перенаправить его вывод в var и использовать эту переменную в качестве параметра для вашего вызова Java. Например:

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

и

#!/bin/ksh
properties_variable=$(java SystemPropertyLoader input.properties)
1 голос
/ 18 июля 2011

Насколько я знаю, вы не можете инициализировать их, но вы определенно можете переопределить их значения на что угодно, используя любой источник, который пожелаете.

0 голосов
/ 05 мая 2017

Использовать JAVA_TOOL_OPTIONS переменную окружения._JAVA_OPTIONS также может работать, но это совсем не задокументировано.JAVA_TOOL_OPTIONS слабо документирован, но вот некоторые ссылки:

Пример использования:

set JAVA_TOOL_OPTIONS=-Dmy.property=sth

При запуске JVM вы увидите сообщение:

Picked up JAVA_TOOL_OPTIONS: ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...