#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";