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时更改系统环境,请随时给我一些建议。
答案 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中启动调用。