Подтвердить что ты не робот

Задайте свойства системы Java с помощью файла конфигурации

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

(то есть: можете ли вы установить java.library.path с помощью файла внутри вашей банки)

EDIT: Уточнение: я задаю вопрос об инициализации свойств системы значением в файле, а не установкой их позже из виртуальной машины. Да, вы можете с легкостью изменять системные свойства по своему желанию после запуска машины, но системные классы Java не будут использовать новые значения.

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

4b9b3361

Ответ 1

Существует способ установить 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 );

Ответ 2

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

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

Ответ 3

Вы можете проанализировать файл свойств с дополнительным кодом (другой экземпляр 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)

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

set JAVA_TOOL_OPTIONS=-Dmy.property=sth

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

Picked up JAVA_TOOL_OPTIONS: ...