Java 启动一个单独的进程并附加参数

Java starting a seperate process and attaching args

当启动一个名为 运行 的程序 Program.java 的单独进程时,我想知道如何向其中添加 args。对于那些不知道的人,args 是您在许多 Java 程序开始时看到的东西: public static void main(String[] args) 我知道当你从终端 运行 一个 .class 文件时,你输入 java [program name] [args]。那么如何在启动单独的进程时添加 args 呢?我的代码:

Class klass=Program.class;
String[] output=new String[2];
String javaHome = System.getProperty("java.home");
String javaBin = javaHome +
     File.separator + "bin" +
     File.separator + "java";
String classpath = System.getProperty("java.class.path");
String className = klass.getCanonicalName();

ProcessBuilder builder = new ProcessBuilder(
     javaBin, "-cp", classpath, className);
builder.redirectErrorStream(true);

Process process = builder.start();
int in = -1;
InputStream is = process.getInputStream();
String[] outputs=new String[2];
try {
    while ((in = is.read()) != -1) {
       outputs[0]=outputs[0]+(char)in;
    }
} catch (IOException ex) {
    ex.printStackTrace();
}
builder.redirectErrorStream(true);
try {
    while ((in = is.read()) != -1) {
           outputs[1]=outputs[1]+(char)in;
    }
} catch (IOException ex) {
    ex.printStackTrace();
}
int exitCode = process.waitFor();
System.out.println("Exited with " + exitCode);

这与 this question 不同,因为我的问题使用 ProcessBuilder 创建流程。

谢谢

"args" 只是初始 JVM 开关后的命令行参数,如 -cp、-D 参数和入口点 class.

以下将启动一个新的 JVM 进程,它将加载 org.example.MainProgram 并将其作为 args 数组传递 [arg0, arg1, arg2]

java -cp bin/* org.example.MainProgram arg0 arg1 arg2

因此在您的示例中,只需将参数添加到 ProcessBuilder 构造函数的末尾

ProcessBuilder builder = new ProcessBuilder(
      javaBin, "-cp", classpath, className, "arg0", "arg1", "arg2");

如果从另一个 Java 应用程序启动 Java 应用程序,您还可以使用另一种策略。这将不允许您捕获标准输出,但如果您控制这两个应用程序,我会考虑使用 API 来访问已启动应用程序的功能,而不是通过流、解析等进行通信...

new Thread(new Runnable() {
   @Override    
    public void run() {
       org.example.MainProgram.main(new String[]{"arg0", "arg1", "arg2"})
    }
}).start();