Ошибка: вызвано: java.io.IOException: ошибка CreateProcess = 2, система не может найти указанный файл.Применяется для всех исполняемых файлов - PullRequest
3 голосов
/ 10 марта 2012

Моя цель - запускать команды SVN из Java для одного из моих требований, для того же самого я уже установил инструмент командной строки TortoiseSVN.Добавил соответствующий путь "C: / Program Files" / TortoiseSVN / bin "к моей переменной" Path "окружения.

При вышеописанной настройке я могу запускать команды svn из командной строки Windows, используя, скажем," svn --version ", и он прекрасно работает.

Теперь возвращаясь к коду, чтобы выполнить то же самое, я использую Processbuilder для этого. Однако я в конечном итоге с вышеупомянутой ошибкой - java.io.IOException: Невозможно запуститьпрограмма "svn --version": ошибка CreateProcess = 2, система не может найти указанный файл.

Я уже пытался выполнить следующие действия,

  1. Использование ProcessBuilder.environment проверенозначения Path и PATH. Путь недействителен, но в PATH настроены все необходимые пути к приложениям, включая путь "TortoiseSVN / bin". Таким образом, в теории ProcessBuilder не указывается местоположение исполняемого файла на его пути.*

    Во время выполнения вместо svn --version я попытался указать полный путь, то есть «C: / Program Files / TortoiseSVN / bin / svn.exe». Это тоже далота же ошибка.

  2. Я пытался использовать тот же код для другого исполняемого файла, например "java -version", который тоже не удался с тем же исключением.сейчас есть чувство, что-то очень простое не правильно.Но я пытался разобраться с этим больше одного дня, но я не получил никаких подсказок.

    Хорошо, еще одна вещь, я запускаю это на Windows 7.

    Нижеэто код, который я использую,

        import java.io.BufferedReader;
        import java.io.ByteArrayOutputStream;
        import java.io.IOException;
        import java.io.InputStreamReader;
    
        public class RunningExecutable {
    
    public static void main(String[] args){
        String command = "svn --version";
    
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {           
            ProcessBuilder svnProcessBuilder = new ProcessBuilder(command);
            String PATH = svnProcessBuilder.environment().get("PATH");
            System.out.println("PATH - " + PATH);
    
            String path = svnProcessBuilder.environment().get("Path");
            System.out.println("Path - " + path);
    
            Process procObject = svnProcessBuilder.start();
    
            BufferedReader cmdStreamReader = new BufferedReader(new InputStreamReader(procObject.getInputStream()));
            String cmdOutput;
            while ((cmdOutput = cmdStreamReader.readLine()) != null) {
                outputStream.write((cmdOutput + "\n").getBytes());
            }
            System.out.println("O/p - " + outputStream.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Throwable th) {
            th.printStackTrace();
        }
    }
        }
    

    С нетерпением жду любых подсказок / указателей вообще.

    Спасибо, Вики

Ответы [ 2 ]

8 голосов
/ 10 марта 2012

Это потому, что вы не используете ProcessBuilder правильно. Javadocs довольно четкие.

Вы не можете передать аргумент --version как часть имени процесса, который вы пытаетесь вызвать; это не имя файла процесса. За кулисами вы выполняете процесс напрямую - никакой оболочки не задействовано.

ProcessBuilder svnProcessBuilder = new ProcessBuilder("svn", "--version");
2 голосов
/ 10 марта 2012

Вам необходимо отделить исполняемый файл от его аргументов:

new ProcessBuilder("svn", "--version")

См. Подробности и примеры в конструкторе ProcessBuilder JavaDoc .

...