我正在编写一个程序,以下列模式形成一个新的子流程:
proc = java.lang.Runtime.getRuntime().exec("java -jar Xxx.jar");
虽然环境变量会自动继承到子流程,但我认为-D<name of property>=<value of the property>
定义的系统属性不是。
我的问题是,如果有任何方法以编程方式传输系统属性。欢迎任何评论或答案。谢谢。
答案 0 :(得分:2)
我提出的一个解决方案是定义一组属性以传递给子进程,并从中创建-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 );
非常天真的解决方案,但无论如何都有效。但仍然不确定可能有更好的解决方案。欢迎任何进一步的评论。
答案 1 :(得分:0)
如果您使用的是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();
使用来自Child Process的代码,您可以使用-D
方法访问父进程中使用System.getProperty
传递的任何系统属性。