是否可以使用某种配置文件初始化Java系统属性?
(即:你可以使用jar中的文件设置java.library.path)
编辑:澄清:我特别询问将系统属性初始化到文件中的值,而不是稍后从虚拟机内部设置它们。是的,您可以在计算机启动后将系统属性更改为您想要的任何内容,但Java系统类不会使用新值。
实际上,这意味着System.setProperty和System.setProperties对于加载本机库毫无用处,因为JNI将始终使用java.library.path的原始值来加载库。我试图找出是否有一个更清洁的替代方案,只需将-Djava.library.path =放在任何地方的启动脚本中。
答案 0 :(得分:15)
有一种以编程方式设置java.library.path的方法,请参阅this。
代码是在ClassLoader上设置sys_path字段的黑客,
System.setProperty( "java.library.path", "/path/to/libs" );
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
答案 1 :(得分:12)
自己做起来很简单:
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 :(得分:2)
您可以使用其他代码(另一个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)
答案 3 :(得分:2)
我认为System.setProperty(key,value)
对于程序中java.library.path
无用的原因是您的应用程序已启动,您需要在程序运行之前设置它。
检查您的本机库,如果该库具有未包含在java.library.path
中的任何依赖项,则System.load将失败,就像System.setProperty(key, value)
无法按预期工作一样。
答案 4 :(得分:1)
据我所知,你不能初始化它们,但你可以使用你想要的任何来源将它们的值覆盖到你想要的任何东西。
答案 5 :(得分:0)
使用JAVA_TOOL_OPTIONS
环境变量。 _JAVA_OPTIONS
也可能有效,但根本没有记录。 JAVA_TOOL_OPTIONS
的记录很少,但这里有一些链接:
使用示例:
set JAVA_TOOL_OPTIONS=-Dmy.property=sth
启动JVM时,您会看到一条消息:
Picked up JAVA_TOOL_OPTIONS: ...