我正在编写一个程序,该程序以以下模式形成一个新的子进程:
proc = java.lang.Runtime.getRuntime().exec("java -jar Xxx.jar");
虽然环境变量是自动继承到子进程的,但我认为-D<name of property>=<value of the property>
定义的系统属性不是。
我的问题是,是否有任何方法可以通过编程方式传输系统属性。欢迎任何意见或回答。谢谢
我提出的一个解决方案是定义一组要传递给子流程的属性,并从中创建-D<key>=<value>
字符串。
static String[] properties_to_pass = {
"log4j.configuration"
};
上面是要传递的一组系统属性。然后。。。
StringBuffer properties = new StringBuffer();
for ( String property : properties_to_pass ) {
String value = System.getProperty(property);
if ( value != null ) {
String r = String.format("-D%s=%s ", property, value);
properties.append( r );
}
}
在以上内容之后。。。
String command_arg = properties.toString();
String command = String.format("java %s -jar Torpedo.jar", command_arg);
java.lang.Runtime.getRuntime.exec( command );
非常天真的解决方案,但无论如何都有效。但仍然不确定是否有更好的解决方案。欢迎任何进一步的评论。
如果您正在使用Java 1.5+
,强烈建议使用ProcessBuilder
来创建流程,因为它允许使用许多方便的方法来实现您正在尝试的内容。
您可以通过ProcessBuilder
实现系统属性的共享,如下所示。
Properties props = System.getProperties();
ProcessBuilder builder = new ProcessBuilder(new String[] {"java", "-jar","Xxx.jar"});
Map<String, String> env = builder.environment();
for(String prop:props.stringPropertyNames()) {
env.put(prop, props.getProperty(prop));
}
Process process = builder.start();
使用子进程中的此代码,您可以使用System.getProperty
方法访问父进程中使用-D
传递的任何系统属性。