Запуск других программ из Java - PullRequest
2 голосов
/ 14 января 2010

Мне нужно запустить пару других программ из моей собственной Java-программы, в основном мне нужно запустить эти операторы командной строки.

svn log --xml -v > svn.log

и

java -jar example.jar arg1 arg2

и мне нужно использовать текстовые выводы, записанные на консоли из этих программ, в моей собственной программе. Я пробовал Runtime.getRuntime (). Exec () с svn, но, похоже, он ничего не делает, потому что не создает файл svn.log. Также обе программы должны вызываться в разных местах, строка svn должна вызываться из одной папки, а строка java вызываться из другой.

Есть идеи, как это сделать? Если это невозможно в Java, есть ли способ сделать это в C #?

Спасибо

Ответы [ 6 ]

3 голосов
/ 15 января 2010

Перенаправление > (подобно каналу |) является конструкцией оболочки и работает, только когда вы выполняете вещи через /bin/sh (или эквивалент). Так что вышесказанное на самом деле не сработает. Вы можете выполнить

/bin/sh -c "svn log --xml -v > svn.log"

и читать svn.log.

В качестве альтернативы, вы можете прочитать результат выполнения процесса и вывести его в файл (если вам нужно вывести его в файл, или просто использовать его непосредственно во время чтения). Если вы выберете этот маршрут и будете использовать stdout / stderr отдельно, обратите внимание, что когда вы используете вывод (stdout), вам также необходимо использовать stderr и одновременно, иначе буферы будут блокировать (и ваш порожденный процесс), ожидая, пока ваш процесс сработает этот. См. этот ответ для получения более подробной информации.

3 голосов
/ 14 января 2010

Здесь:

ProcessBuilder processbuilder
try 
{
    processbuilder.directory(file);
    processbuilder.redirectErrorStream(true);

    process = processbuilder.start();

    String readLine;
    BufferedReader output = new BufferedReader(new InputStreamReader(process.getInputStream()));
    // include this too: 
    // BufferedReader output = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    while((readLine = output.readLine()) != null)
    {
        m_Logger.info(readLine);
    }

    process.waitFor();
}

Я использовал нечто подобное. Вы действительно хотите сделать что-то с readLine. Я просто скопировал и вставил из кода, где мне было все равно, что он сказал.

0 голосов
/ 20 сентября 2017

Попробуйте это

public static void main(String[] args) {
        try {
            // Execute a command with an argument that contains a space
            System.out.println(args[0]);
            String[]commands = new String[]{"svn", "info", args[0]};
            Process process = Runtime.getRuntime().exec(commands);
            BufferedReader reader =  new BufferedReader(new InputStreamReader(process.getInputStream()));
            StringBuilder builder = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
                builder.append(System.getProperty("line.separator"));
            }
            String result = builder.toString();
            System.out.println(result);

        }catch(Exception e){
            System.out.print(e);
        }
    }
0 голосов
/ 15 января 2010

Видя две ваши команды, почему бы вам не сделать это напрямую из Java, без выполнения? Вы можете использовать SVNKit для части svn и напрямую включать файлы jar в ваш путь к классам.

0 голосов
/ 15 января 2010

Для работы с svn используйте java SVNKit API.

0 голосов
/ 14 января 2010

вместо использования команды в вашей команде, просто позвольте ей печатать на стандартный вывод и вывод ошибок. Вы можете получить доступ к этим потокам из вашего объекта процесса, который возвращается из exec.

...