Java ProcessBuilder() 运行一个程序,但程序没有 return 任何输出
Java ProcessBuilder() runs a program, but the program doesn't return any output
我运行程序是这样的:
Process process;
try {
process = new ProcessBuilder("java", "-jar", "test.jar", "1", "20").start();
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
我调用的程序使用标准输出System.out.println("Hello!");
但是,调用程序什么也得不到。我使用 ProcessBuilder() 错了吗?谢谢!
如果没有启动另一个 JVM 的限制(例如:在 test.jar 中使用 System.exit()),您可以加载并 运行 里面的 test.jar
当前的 JVM。
以下代码段显示了原理。
File file = new File("/tmp/test.jar");
URLClassLoader loader = new URLClassLoader(
new URL[]{file.toURI().toURL()}
);
String className = new JarFile(file)
.getManifest()
.getMainAttributes()
.getValue(Attributes.Name.MAIN_CLASS);
Method main = loader
.loadClass(className)
.getDeclaredMethod("main", String[].class);
Object arg = new String[]{"1", "20"};
try {
main.invoke(null, arg);
} catch (Exception e) {
// do appropriate exception handling here
e.printStackTrace(System.err);
}
我运行程序是这样的:
Process process;
try {
process = new ProcessBuilder("java", "-jar", "test.jar", "1", "20").start();
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
我调用的程序使用标准输出System.out.println("Hello!");
但是,调用程序什么也得不到。我使用 ProcessBuilder() 错了吗?谢谢!
如果没有启动另一个 JVM 的限制(例如:在 test.jar 中使用 System.exit()),您可以加载并 运行 里面的 test.jar
当前的 JVM。
以下代码段显示了原理。
File file = new File("/tmp/test.jar");
URLClassLoader loader = new URLClassLoader(
new URL[]{file.toURI().toURL()}
);
String className = new JarFile(file)
.getManifest()
.getMainAttributes()
.getValue(Attributes.Name.MAIN_CLASS);
Method main = loader
.loadClass(className)
.getDeclaredMethod("main", String[].class);
Object arg = new String[]{"1", "20"};
try {
main.invoke(null, arg);
} catch (Exception e) {
// do appropriate exception handling here
e.printStackTrace(System.err);
}