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();
当启动一个名为 运行 的程序 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();