有没有办法在ProcessBuilder中运行方法/函数?

时间:2016-10-20 01:50:45

标签: java

ProcessBuilder pb = new ProcessBuilder("command", "Arg1", "Arg2"); 通常用于运行外部程序,例如

ProcessBuilder

现在我想使用ProcessBuilder pb = new ProcessBuilder(Foo, param1, param2); 运行一个函数,例如:

Foo

您可能想知道为什么不直接调用Foo(param1, param2) ?像

ProcessBuilder

因为我想在运行Foo时更改系统环境。我找到的唯一方法是使用Map<String, String> env = pb.environment(); env.put("HADOOP_HOME", "/opt/hadoop");

ProcessBuilder

所以我想知道我是否可以使用{{1}}来调用当前程序的方法/函数。如果你有更好的想法在运行Foo时更改系统环境,请随时给我一些建议。

1 个答案:

答案 0 :(得分:0)

运行分叉的Java进程是一项非常重要的任务。显然可以这样做,因为大多数构建系统都会这样做,但它并不像看起来那么容易。有许多龙,因为你需要组装一个完整的命令行,而且当涉及类路径等讨厌的事情时,这非常棘手。

我曾经开发过一个名为ForkedRun的类,它试图提供一个稍微友好的API。我已经在代码演示中使用它来进行我给about unit testing compilers and other similar madness的演讲。我一直计划把它变成一个图书馆,但是我从来没有时间。

无论如何,课程在这里:ForkedRun。随意克隆或窃取它。

您必须编写的代码将与

一致
new ForkedRun(Foo.class)
    .withArg("first argument")
    .withArg("second argument")
    .withEnv("key", "value")
    .run();

但您必须自己实施.withEnv()方法。

但如果所有这些对您来说太复杂,我会将您当前的应用程序包装在一个shell脚本中,该脚本设置环境变量并在同一个VM中启动调用。