【问题标题】:ProcessBuilder starting a .class file with parametersProcessBuilder 使用参数启动 .class 文件
【发布时间】:2021-12-03 23:43:50
【问题描述】:

所以我有两个文件: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]));
    }

我的第二个进程应该返回特定的退出值(这就是我使用 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();
            }

但这不起作用。 我想我不需要完全在我的程序中创建类文件,我稍后将通过 cmd 创建它们。 如何在 Second.main() 中提供我需要的 ProcessBuilder String[] args?

【问题讨论】:

  • 为什么要将其他 Java 类称为单独的进程,而不是将它们作为 Java API 调用?
  • 您将目录名称传递给java,这是无效的。您是否忘记了 "-cp" 参数?此外,您正在传递带有小写 s"second",如果类名是带有大写 SSecond,则会失败。您可以使用currentRelativePath 删除所有这些代码,只需编写String curDir = "src";,因为所有路径要么是绝对路径,要么隐含相对于当前目录。
  • @LouisWasserman 我是一名学生,这是我的任务。我需要创建一个项目,用户将在其中输入一些输入参数,然后我的 main 使用此参数启动两个进程。例如,用户输入 f 5,然后输入 g 3。我需要启动 second 两次(如果可能,同时启动),第一次使用参数 f 5,第二次使用 g 3。在 Second.java 中将类似于 [ if (args[0]=="f"){does something} else if (args[0]=="g"){...} else exitvalue error]。另外我不明白您在“将它们作为 Java API 调用”中的意思
  • @VGR 哦,谢谢,它适用于“-cp”,我会读到它。您可以将其发布为答案吗?

标签: java process processbuilder


【解决方案1】:

你正在执行这个命令:java directory second 5

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

java [-options] 类 [args...]

传递类名是正确的。传递目录是不正确的。

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

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

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

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

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

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

String curDir = "src";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多