ProcessBuilder 使用参数启动 .class 文件

ProcessBuilder starting a .class file with parameters

所以我有两个文件:Main.java 和 Second.java。我想使用 ProcessBuilder 处理流程。使用 cmd 我可以写“javac Second.java”和“java Second 5”。我的 Second.java 看起来像那样

public static void main(String[] args) {
        System.out.println("Okay");
        System.out.println(Integer.parseInt(args[0])); // I need it just for checking
        System.exit( Integer.parseInt(args[0]));
    }

我的第二个进程应该 return 特定的退出值(这就是我使用 System.exit() 的原因)。 我知道 ProcessBuilder 不是 cmd。我试过 运行 那样

   Path currentRelativePath = Paths.get("");
   String curDir=currentRelativePath.toAbsolutePath().toString();
   curDir=curDir+"\src";
   ProcessBuilder PB=new ProcessBuilder("java",curDir, "second", "5");
   try {
                Process process = PB.start();
                process.waitFor();
                System.out.println(process.exitValue());
            }catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

但这不起作用。 我想我不需要完全在我的程序中创建 class 文件,我稍后会通过 cmd 创建它们。 我怎样才能给我的 ProcessBuilder String[] args,我需要在 Second.main()?

您正在执行此命令:java 目录 second 5

这不是 java 命令的有效调用。语法是:

java [-选项] class [args...]

传递 class 名称是正确的。传递目录不正确。

您可以通过 运行 java -h 或阅读 the documentation 自行查看语法。无需猜测允许的内容。

允许做的是将目录作为参数传递给 -cp 选项,这可能是您想要的:

new ProcessBuilder("java", "-cp", curDir, "second", "5");

请注意 class 名称区分大小写。如果您的 class 被命名为 Second,您必须将相同的名称以大写 S 传递给您的 java 命令:

new ProcessBuilder("java", "-cp", curDir, "Second", "5");
                                           ↑
                                           Uppercase S

所有文件路径要么是绝对路径,要么隐含地相对于当前目录。你不需要所有那些处理 currentRelativePath 的行。就这样写:

String curDir = "src";