ProcessBuilder запускает Java-программу: IOException.Не удалось запустить процесс.Причина: не удается запустить программу CreateProcess error = 2 - PullRequest
0 голосов
/ 11 июля 2019

У меня есть простой класс, подобный этому:

public class Dog  {
  public static void main(String[] args)  {
    System.out.println("DOG");
    }
}

Он соответствует Dog.class, который расположен внутри C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\Test\classes.Я пытаюсь запустить его с помощью ProcessBuilder:

public static void main(String[] args) {
        String pathName = "-cp \"C:\\Program Files\\Apache Software Foundation\\Tomcat 8.5\\webapps\\Test\\classes" + "\" " + "Dog";
        runCode(pathName); 
    }
public static void runCode(String name)  {
           System.out.println(name);  //-cp "C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\Test\classes" Dog

           ProcessBuilder processBuilder = new ProcessBuilder("java " + name);
           processBuilder.redirectError(new File(Paths.get("C:\\Program Files\\Apache Software Foundation\\Tomcat 8.5\\webapps\\JavaStudyRooms\\output.txt").toString()));
           processBuilder.redirectInput();

       try {
           final Process process = processBuilder.start();
           try {
               final int exitStatus = process.waitFor();
               if(exitStatus==0){
                   System.out.println("External class  Started Successfully.");
                   System.exit(0); //or whatever suits
               }else{
                   System.out.println("There was an error starting external class. Perhaps path issues. Use exit code "+exitStatus+" for details.");
                   System.out.println("Check also output file for additional details.");
                   System.exit(1);//whatever
               }
           } catch (InterruptedException ex) {
               System.out.println("InterruptedException: "+ex.getMessage());
           }
       } catch (IOException ex) {
           System.out.println("IOException. Faild to start process. Reason: "+ex.getMessage());
       }
       System.out.println("Process Terminated.");
       System.exit(0);

   }

выдает ошибку:

-cp "C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\Test\classes" Dog
IOException. Faild to start process. Reason: Cannot run program "java -cp "C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\Test\classes" Dog": CreateProcess error=2, Cannot find the file
Process Terminated.

Почему это происходит и как это исправить?

1 Ответ

1 голос
/ 11 июля 2019

ProcessBuilder не занимает всю командную строку.Он принимает аргументы.

Ваш текущий код ищет программу с базовым именем длиной 90 символов, например java -cp … Dog.exe.

Вам необходимо передать массив аргументов:

// Note the use of a String array, not a single String

public static void runCode(String... javaArgs) {

    List<String> args = new ArrayList<>();
    args.add("java");
    Collections.addAll(args, javaArgs);

    ProcessBuilder processBuilder = new ProcessBuilder(args);

Это может быть вызвано как:

runCode(
    "-cp",
    "C:\\Program Files\\Apache Software Foundation\\Tomcat 8.5\\webapps\\Test\\classes",
    "Dog");

Кроме того, не просто распечатывайте сообщение об исключении.Сообщение само по себе редко бывает полезным.Обычно вы хотите распечатать всю трассировку стека, чтобы иметь всю информацию и точно знать, где возникла проблема:

   } catch (IOException ex) {
       ex.printStackTrace();
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...