Задайте свойства системы Java с помощью файла конфигурации
Возможно ли инициализировать свойства системы Java с помощью какого-либо файла конфигурации?
(то есть: можете ли вы установить java.library.path с помощью файла внутри вашей банки)
EDIT: Уточнение: я задаю вопрос об инициализации свойств системы значением в файле, а не установкой их позже из виртуальной машины. Да, вы можете с легкостью изменять системные свойства по своему желанию после запуска машины, но системные классы Java не будут использовать новые значения.
Практически это означает, что System.setProperty и System.setProperties бесполезны для загрузки собственных библиотек, поскольку JNI всегда будет использовать исходное значение java.library.path для загрузки библиотек. Я пытаюсь выяснить, есть ли более чистая альтернатива простому размещению -Djava.library.path = независимо от запуска скриптов повсюду.
Ответы
Ответ 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: ...