如何使用ProcessBuilder启动带运行参数的.class文件并给main方法传参
问题解决说明
核心错误原因
- ProcessBuilder构造的命令参数不符合
java启动命令的规范:标准的java启动类命令格式是java -cp <类路径> <主类名> <参数1> <参数2>...,你之前把类路径直接作为第二个参数传给java命令,格式完全错误。 - 主类名大小写错误:你的类名是
Second,代码里写了小写的second,Java类加载是区分大小写的,会找不到类。 - 没有处理子进程的输出流,子进程打印的内容占满输出缓冲区后会阻塞,无法正常执行到
System.exit步骤。
修正后的代码
import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { Path currentRelativePath = Paths.get(""); String curDir = currentRelativePath.toAbsolutePath().toString() + File.separator + "src"; // 构造正确的命令参数:java -cp 类路径 主类名 入参 ProcessBuilder pb = new ProcessBuilder("java", "-cp", curDir, "Second", "5"); // 把子进程的输入输出合并到当前进程,既方便调试,也避免缓冲区满导致子进程阻塞 pb.inheritIO(); try { Process process = pb.start(); int exitCode = process.waitFor(); System.out.println("子进程退出值:" + exitCode); } catch (IOException e1) { e1.printStackTrace(); } catch (InterruptedException e) { // 恢复中断状态,符合最佳实践 Thread.currentThread().interrupt(); e.printStackTrace(); } } }
关键说明
- 参数传递规则:
ProcessBuilder的可变参数列表里,主类名之后的所有参数都会自动作为main方法的String[] args数组传入,你要传的参数5放在最后就可以正确被args[0]读取。 - 如果不想用
inheritIO,也可以主动读取process.getInputStream()和process.getErrorStream()的内容,同样可以避免子进程阻塞。 - 不需要额外处理编译步骤,只要你提前通过cmd把
Second.java编译成Second.class放在src目录下,代码就可以正常运行。
内容的提问来源于stack exchange,提问作者P34R
相关产品推荐
相关产品推荐

