【问题标题】:How to pass system property values to a processBuilder?如何将系统属性值传递给 processBuilder?
【发布时间】:2017-03-02 23:13:21
【问题描述】:

Java 的 Runtime 类允许在运行 jar 时将命名系统属性值作为命令行参数发送。如下:

Runtime.getRuntime().exec("java -jar -DiName=ABC C:\\Test.jar");

我正在尝试从 Runtime 迁移到 ProcessBuilder 以实现相同的功能。需要有关正确方法的建议。

ProcessBuilder pb = new ProcessBuilder("java",  "-jar",  "C:\\Test.jar").start();

在上面的代码中,如何传递“iName”?

我从 Runtime 迁移到 ProcessBuilder 的原因是,触发此 Runtime 代码的 java 程序无法在使用 1.8.0_40 JDK 的特定生产环境中运行。

【问题讨论】:

  • 什么是“iName”?
  • 显然应该是("java","-DiName=ABC", "-jar", "C:\\Test.jar")

标签: java arguments runtime parameter-passing processbuilder


【解决方案1】:

看看Javadoc

这里明确指出 ProcessBuilder 构造函数可以是 public ProcessBuilder(String... command) 的形式(例如,请参阅 Timothy Truckle 评论),或者等效地,只是一个 @987654324 类型的参数@。

Runtime相反,它标记了一个字符串,这里是ProcessBuilder,需要已经标记化的参数列表。

可能,为了避免任何将来的混淆,最好将参数存储在一个变量中,以便以后修改。例如:

List<String> params = java.util.Arrays.asList("java", "-jar", "-DiName=ABC", "C:\\Test.jar");
ProcessBuilder pb = new ProcessBuilder(params).start();

希望这从长远来看会有所帮助!

【讨论】:

    【解决方案2】:
    new ProcessBuilder("java",  "-jar", "-DiName=ABC", "C:\\Test.jar");
    

    ProcessBuilder 接收参数数组(可变参数),将被连接并执行。

    【讨论】: