ProcessBuilder запускает файл .class с параметрами

#java #process #processbuilder

Вопрос:

Итак, у меня есть два файла: Main.java и Second.java. Я хочу работать с процессами с помощью ProcessBuilder. С помощью cmd я могу написать «javac Second.java» и «java Second 5». Мой Второй.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.
Как я могу дать моей строке ProcessBuilder[] аргументы, которые мне нужны в моем втором.main()?

Комментарии:

1. Почему вы вызываете другие классы Java как отдельные процессы, а не вызываете их как API Java?

2. Вы передаете имя каталога java , которое является недопустимым. Ты забыл "-cp" о ссоре? Кроме того, вы передаете "second" данные в нижнем регистре s , что приведет к ошибке, если имя класса Second указано в верхнем регистре S . И вы можете удалить весь этот код currentRelativePath и просто написать String curDir = "src"; , так как все пути либо абсолютны, либо неявно относятся к текущему каталогу.

3. @LouisWasserman Я студент, и это моя задача. Мне нужно создать проект, в котором пользователь введет некоторые входные параметры, а затем мой основной запускает два процесса с этими параметрами. Например, пользователь вводит f 5, а затем g 3. Мне нужно начать второй два раза (одновременно, если это возможно), сначала с параметрами f 5, а затем с g 3. Во-Вторых. java будет чем-то вроде [ if (args[0]==»f»){делает что-то} еще, если (args[0]==»g»){…} ошибка выхода другого значения]. Также я не понял, что вы имеете в виду, говоря «вызывая их в качестве API Java».

4. @VGR О, спасибо, это работает с «-cp», я прочитаю об этом. Можете ли вы опубликовать его в качестве ответа?

Ответ №1:

Вы выполняете эту команду: второй каталог java 5

Это недопустимый вызов java команды. Синтаксис таков:

java [-параметры] класс [аргументы…]

Передача имени класса является правильной. Передача каталога не является правильной.

Вы можете сами ознакомиться с синтаксисом , запустив java -h или прочитав документацию. Не нужно гадать, что разрешено.

Вам разрешено передать каталог в качестве аргумента -cp опции, что, вероятно, и было задумано:

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

Имейте в виду, что имена классов чувствительны к регистру. Если ваш класс имеет имя Second , вы должны передать то же имя с большой буквы S вашей команде java:

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

Все пути к файлам являются либо абсолютными путями, либо неявно относятся к текущему каталогу. Вам не нужно разбираться со всеми этими строками currentRelativePath . Просто напиши это:

 String curDir = "src";