有没有办法将系统属性转移到子流程?

时间:2014-09-22 02:37:14

标签: java

我正在编写一个程序,以下列模式形成一个新的子流程:

proc = java.lang.Runtime.getRuntime().exec("java -jar Xxx.jar");

虽然环境变量会自动继承到子流程,但我认为-D<name of property>=<value of the property>定义的系统属性不是。

我的问题是,如果有任何方法以编程方式传输系统属性。欢迎任何评论或答案。谢谢。

2 个答案:

答案 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传递的任何系统属性。